; PLIK: spell.com, LICZBY: Hex, KOD: Atascii

	icl 'etyk.asm'

; Blok $0600 - $06f8:

	org $600

0600 lda savmsc         display list od adresu $cccb
0602 sta $cb            (pod tym adresem nic jednak nie ma)
0604 lda savmsc+1
0606 sta $cc
0606 lda #$ff           INIT
0608 sta portb
060b lda #$01           poke 752,1
060d sta crsinh
0610 lda #$00
0612 sta color0
0615 sta color1
0618 ldy #$02
061a sta (savmsc),y
061c lda #$08
061e sta color2
0621 sta color4         kursor off
0624 lda savmsc
0626 clc
0627 adc #$4a
0629 sta $cb
062b lda savmsc+1
062d adc #$01
062f sta $cc
0631 ldy #$11
0633 lda $064c,y
0636 sta ($cb),y
0638 dey
0639 bpl $0633          napis: LOADING SPELLBOUND
063b ldx #$00
063d jsr $065e          rts
0640 ldx #$06
0642 jsr $065e          rts
0645 ldx #$0c
0647 jsr $065e          rts
064a clc
064b rts

064c dta d'LOADING SPELLBOUND'

065f lda #$3c           RUN
0661 sta pactl          silnik stop
0664 jmp $0c00          SPELLBOUND START!

; Blok $0c00 - $6400:

	org $c00

0c00 lda #$00           START!
0c02 sta coldst         reset aktywny
0c05 lda #$02
0c07 sta boot
0c09 lda #$00
0c0b sta casini
0c0d lda #$0c
0c0f sta casini+1       po resecie skok do $c00
0c11 jsr $3e10          ustaw VVBLKI
0c14 lda #$00
0c16 sta color4
0c19 lda #$ee
0c1b sta color0
0c1e lda #$b8
0c20 sta color1
0c23 lda #$0a
0c25 sta color2         ustaw kolory

; Tu skacze program po komunikacie "GAME OVER"

0c28 lda portb
0c2b ora #$02
0c2d sta portb          BASIC OFF
0c30 lda #$00           zablokuj upyw czasu
0c32 sta $0947
0c35 ldx #$ff
0c37 txs                inicjacja stosu

0c38 jsr $0db4          inicjacja ekranu
0c3b lda #$40
0c3d sta nmien          tylko przerwania VVBLK
0c40 jsr $1a3f          Wywietl dwa okienka pojawiajce si przy starcie
0c43 jsr $1af6          zwr w A identyfikator wybranej joystickiem pozycji
0c46 cmp #$41           Wybrana opcja 'A' -> $0c51
0c48 beq $0c51
0c4a cmp #$42           Wybrana opcja 'B' -> $0c57
0c4c beq $0c57
0c4e jmp $0c43          Ani 'A' ani 'B'   -> powrt

0c51 jsr $1c97          Opcja 'A':
0c54 jmp $0c38          Powrt

; Opcja 'B': start gry

0c57 jsr $0dd1          Wyczy ekran
0c5a ldy #$00
0c5c lda #$00
0c5e sta $0900,y        Wyzeruj pami w obszarze $900 - $9ff
0c61 iny
0c62 bne $0c5e
0c64 ldx #$fd           Przygotuj si do kopiowania bloku danych ... -> $03fd
0c66 ldy #$03
0c68 jsr $1e18
0c6b ldx #$d3           Skopiuj $48 bajtw: $4bd3..$4c1a -> $03fd..$0444
0c6d ldy #$4b
0c6f lda #$48
0c71 jsr $1e1d
0c74 ldx #$00           Skopiuj $08 bajtw: $4400..$4407 -> $0445..$044c
0c76 ldy #$44				bd! - kopiowane jest tutaj za duo bajtw.
0c78 lda #$08				Wystarczyoby kopiowa $4400-$4405
0c7a jsr $1e1d
0c7d ldx #$81           Skopiuj $2d bajtw: $4781..$47ad -> $044d..$0479
0c7f ldy #$47           - stan posiadania Magic Knighta, Gimbala, Thora, ... -
0c81 lda #$2d           tablica piciobajtowa dla kadej postaci z numerami
0c83 jsr $1e1d          przedmiotw
0c86 ldx #$ae           Skopiuj $18 bajtw: $47ae..$47c5 -> $047a..$0491
0c88 ldy #$47           - tablica rozmieszczenia postaci (poza MK)
0c8a lda #$18           off. 0 - lokacja, off. 1 - poz. X, off. 2 - poz. Y
0c8c jsr $1e1d          (lokacja = $63 - postaci nie ma)
0c8f ldx #$c6           Skopiuj $96 bajtw: $47c6..$485b -> $0492..$0527
0c91 ldy #$47           tablica rozmieszczenia przedmiotw
0c93 lda #$96           off. 0 - lokacja, off. 1 - poz. X, off. 2 - poz. Y -
0c95 jsr $1e1d          $63 $00 $00 jeli przedmiot ma jaka posta
0c98 ldx #$07           inicjacja numeru pozycji w lokacji zajmowanejh przez
0c9a lda #$00           kad posta na 0 (postaci nie ma nigdzie)
0c9c sta $0528,x
0c9f dex
0ca0 bpl $0c9c
0ca2 sta $0927          winda bdzie si na pocztku znajdowaa na dachu
0ca5 sta $4a39          z pierw. lok. na dachu bdzie pocz. w lewo do windy
0ca8 lda #$01           a z windy bdzie si wychodzio w prawo do pierwszej
0caa sta $4a38          lokacji na dachu
0cad lda #$ff           umie w liczb oznaczajc "brak wyjcia z lokacji"
0caf sta $4a49          umie j jako wyjcie w lewo dla pierwszych lokacji
0cb2 sta $4a59          na wszystkich poziomach z wyjtkiem "GROUND FLOOR" i
0cb5 sta $4a69          "BASEMENT"
0cb8 sta $4a79
0cbb sta $4a89
0cbe sta $4a99
0cc1 lda #$15           Magic Knight bdzie si znajdowa w "THE START ROOM"
0cc3 sta $090d
0cc6 jsr $1ce9          Ustal, jaki skad powinno mie menu
0cc9 lda #$00           ustaw na 0 liczb ramek, sekund i minut
0ccb sta $0923
0cce sta $0924
0cd1 sta $0926
0cd4 lda #$01           GIMBALL ma zajmowa pierwsz pozycj w lokacji
0cd6 sta $0528
0cd9 sta $0928          ustaw tryb pojawiania si MK w dymku
0cdc lda #$30           ustaw czas gry na $30 = 48 "godzin"
0cde sta $0925
0ce1 lda #$8b           ustaw, e przy czytaniu "CRYSTALL BALL" drukowany
0ce3 sta $4c4d          bdzie pierwszy dostpny napis
0ce6 lda #$7d           [$30,1] = $047d (adres drugiego elementu tablicy
0ce8 sta $30                             opisujcego rozmieszczenie postaci -
0cea lda #$04                            dane Thora)
0cec sta $31
0cee ldx #$01           X = posta od ktrej rozpoczynamy ustalanie pooe
0cf0 ldy #$00           Y = indeks to tablicy opisujcej pooenie tej postaci
0cf2 txa                numer przetwarzanej postaci zapisujemy na stosie
0cf3 pha
0cf4 lda ($30),y        we pierwszy bajt rozmieszczenia postaci - nr lokacji
0cf6 jsr $1e3a          zwr w X, Y woln pozyc. dla postaci w X dla lok. w A
0cf9 tya                pozycja Y do A
0cfa ldy #$02           zapisz pozycj Y pod indeksem 2
0cfc sta ($30),y
0cfe txa                pozycja X do A
0cff dey                zapisz pozycj Y pod indeksem 1 (2 - 1)
0d00 sta ($30),y
0d02 lda $30            zwiksz $30,1 o 3, aby wskazywao na pocztek danych
0d04 clc                o rozmieszczeniu kolejnej postaci
0d05 adc #$03
0d07 sta $30
0d09 bcc $0d0d
0d0b inc $31
0d0d pla                we numer postaci
0d0e tax                i przelij go do X
0d0f inx                zwiksz o 1 nr postaci
0d10 cpx #$07           czy doszlimy ju do postaci nr 7
0d12 bne $0cf0          nie -> $0cf0 - pocz. ptli (BANSHEE nie przetwarzamy)
0d14 lda #$ad           ustaw adres danych lokacji "THE WALL" na $7187
0d16 sta $7187          (bdzie miaa mur bez wyrwy)
0d19 lda #$76
0d1b sta $7188
0d1e lda #$09           ustawienie zamurowanej ciany w lokacji
0d20 sta $77e2          "SECRET TUNNEL ENTRANCE"
0d23 lda #$08           ustaw licznik uywany przy przemieszcz. postaci na 8
0d25 sta $0929          (na razie adna posta nie bdzie si przemieszczaa)
0d28 lda #$aa           ustaw palet przypisan GIMBALLOWI (argument lda) -
0d2a sta $1862          zielony kwadrat, nic nie wida
0d2d lda #$b0           Dopu przerwania: BREAK KEY, SERIAL IN, SERIAL OUT
0d2f sta pokmsk
0d31 sta irqen
0d34 lda #$01           ustaw klawisz BREAK jako nienacinity
0d36 sta brkkey
0d38 jsr $393d          Zmiana wygldu Magic Knighta na normalny
0d3b lda #$03           zezwalaj na upyw czasu i losowe ruchy postaci
0d3d sta $0947

; Tutaj zaczyna si gwna ptla programu

0d40 lda $090d          We numer lokacji Magic Knighta
0d43 jsr $1310          Narysuj lokacj o numerze w A
0d46 jsr $1be5          Odczytaj stan joystickw. Wynik w $091c i w A.
0d49 lda $0938          we nr fazy animacji przy skoku Magic Knighta
0d4c bne $0d5e          gdy MK podczas skoku -> $0d5e (przeskocz obsug FIRE)
0d4e lda $091c          We odczytany stan joysticka
0d51 and #$10           sprawd fire
0d53 bne $0d5e          jeli niewcinity -> skok do $0d5e
0d55 jsr $1cdc          Czekaj na zwolnienie przycisku joysticka
0d58 jsr $2071          narysuj menu i wykonaj polecenie
0d5b jmp $0d40          Skok na pocztek gwnej ptli programu

0d5e lda $0938          we nr fazy animacji przy skoku Magic Knighta
0d61 bne $0d68          <> 0 -> $0d68 (do fragmentu obsugujcego skok)
0d63 jsr $2917          skok do procedury obsugujcej opadanie MK z wysokoci
0d66 bcc $0d84          C = 0 (zmieniono poz.) -> $0d84 (rysuj Magic Knighta)

0d68 jsr $2937          wywoaj procedur obsugi skoku MK
0d6b bcc $0d84          C = 0 (nie zmieniono pozycji) -> $0d84 (rysuj MK)
0d6d lda $091c          We odczytany stan joysticka
0d70 and #$04           sprawd, czy jest wychylony w lewo
0d72 bne $0d7a          nie -> skok do $0d7a
0d74 jsr $2895          sprbuj wykona ruch MK w lewo o 1 piksel
0d77 jmp $0d84          przeskok do fragmentu rysujcego Magic Knighta

0d7a lda $091c          We odczytany stan joysticka
0d7d and #$08           sprawd, czy jest wychylony w prawo
0d7f bne $0d98          nie -> skok do $0d98 (zmie lokacj gdy trzeba)
0d81 jsr $287b          sprbuj wykona ruch MK w prawo o 1 piksel

0d84 jsr $281f          ustal nr bitmapy przypisanej Magic Knightowi
0d87 jsr $2641          Narysuj Magic Knighta
0d8a lda $090d          we numer lokacji Magic Knighta
0d8d cmp #$0c           czy jest on w lokacji "THE BALLROOM"?
0d8f beq $0da2          tak -> $0da2 (pomi ptl opniajc)
0d91 cmp #$25           czy jest on w lokacji "THE SPARE BALLROOM"?
0d93 beq $0da2          tak -> 0da2 (pomi ptl opniajc)
0d95 ldx #$01           bdzie maa ptla opniajca - X=1 zamiast $0f
0d97 dta $2c				jest to kod instrukcji bit $xxxx, ktrej wykonanie
;                       spowoduje przeskok przez instrukcj ldx poniej

; Procedura wykonuje ptl opniajc, zmienia lokacj, gdy trzeba, ustawia
; menu i wykonuje procedur obsugi lokacji

0d98 ldx #$0e           Wykonaj ptl opniajc
0d9a ldy #$ff
0d9c dey
0d9d bne $0d9c
0d9f dex
0da0 bne $0d9c
0da2 jsr $2c2e          gdy trzeba, zmie lok. i menu, wyk. proc. obs. lokac.
0da5 jsr $42e1          Sprawd, czy nie nacinito BREAK
0da8 jmp $0d46          powrt do odczytywania stanu joystickw

; Procedura bdu - miga ramk obrazu, nie ma z niej wyjcia. Nie uywana.

0dab lda random
0dae sta colbak
0db1 jmp $0dab

0db4 jsr $0dd1          Wyczy ekran
0db7 lda #$00
0db9 sta sdlist
0dbc lda #$bf
0dbe sta sdlist+1       DISPLAY LIST = $bf00, pami obrazu = $8800
0dc1 lda #$21
0dc3 sta sdmctl         poke 559, 35 (ekran wski)
0dc6 lda #$00           inicjacja komrki, ktra jednak nie jest dalej
0dc8 sta $0904          wykorzystywana
0dcb lda #$e4
0dcd jsr $0dea          Przetwrz palet ($e4) na kody poszczeglnych kolorw
0dd0 rts

; Wyczy ekran

0dd1 lda #$00
0dd3 sta $30
0dd5 lda #$88
0dd7 sta $31
0dd9 ldy #$00
0ddb tya
0ddc sta ($30),y
0dde iny
0ddf bne $0ddc
0de1 inc $31
0de3 lda $31
0de5 cmp #$a0           6144 bajty pamici obrazu (32 * 192)
0de7 bne $0ddb
0de9 rts

; Wyodrbnij po dwa bity z A, zapisz je (od dwch najmodszych do dwch
; najstarszych) w najmodszych bitach bajtw $e11,4

0dea sta $0e10
0ded tya                Y na stos
0dee pha
0def txa                X na stos
0df0 pha
0df1 ldx #$03
0df3 lda $0e10
0df6 tay
0df7 lda #$00
0df9 sta $0e11,x
0dfc tya
0dfd asl @
0dfe rol $0e11,x
0e01 asl @
0e02 rol $0e11,x
0e05 dex
0e06 bpl $0df6
0e08 pla                we X ze stosu
0e09 tax
0e0a pla                we Y ze stosu
0e0b tay
0e0c lda $0e10
0e0f rts

0e10 dta 0, 0, 0, 0, 0

; Przetwrz bajt do umieszczenia na ekranie na bajt z uwzgldnionymi kodami
; kolorw

0e15 sta $0e42          do przetworzenia
0e18 tya                Y na stos
0e19 pha
0e1a txa                X na stos
0e1b pha
0e1c lda $0e10          paleta kolorw
0e1f cmp #$e4
0e21 beq $0e3d          a moe nie trzeba nic przetwarza?
0e23 ldx #$03
0e25 lda #$00
0e27 asl $0e42
0e2a rol @
0e2b asl $0e42
0e2e rol @              2 grne bity z A = index
0e2f tay
0e30 lda $0e42
0e33 clc
0e34 adc $0e11,y        wstaw element z tablicy $e11,4 do A
0e37 sta $0e42
0e3a dex
0e3b bpl $0e25
0e3d pla                we X ze stosu
0e3e tax
0e3f pla                we Y ze stosu
0e40 tay
0e41 lda #$00
0e43 rts

; Procedura rysuje na ekranie bitmap o wymiarach 4x8 pikseli (1 kratka) o
; numerze podanym w A. Adres pocztku bitmapy na ekranie podany jest w $cb,c

0e44 asl @              A =* 2
0e45 ldy #$00           zainicjuj na 0 starszy bajt adresu bitmapy 4x8 (w jmp)
0e47 sty $0e66
0e4a asl @              A =* 2
0e4b rol $0e66          (zap ewentualny bit przeniesienia w starszym bajcie)
0e4e asl @              A =* 2 (cznie mnoymy A przez 8)
0e4f rol $0e66          (zap ewentualny bit przeniesienia w starszym bajcie)
0e52 clc                dodawanie zera jest tu niepotrzebne (C zawsze rwne 0)
0e53 adc #$00
0e55 sta $0e65          A zapisujemy jako modszy bajt adresu
0e58 lda $0e66          zwiksz starszy bajt adr.o $85 ($8500 - pocz. bitmap)
0e5b adc #$85
0e5d sta $0e66
0e60 ldy #$00           zainicjuj na 0 indeks do pamici ekranu
0e62 ldx #$00           zainicjuj na 0 indeks do bajtu do skopiowania
0e64 lda irqmv+1,x      we bajt do skopiowania (argument ustawiony)
0e67 jsr $0e15          Uwzgldnij aktualn palet kolorw
0e6a sta ($cb),y        umie bajt w pamici ekranu
0e6c inx                zwiksz o 1 indeks do bajtu do skopiowania
0e6d tya                zwiksz warto w Y o $20 (nastpna linia)
0e6e clc
0e6f adc #$20
0e71 tay
0e72 bne $0e64          gdy przetworzono 8 linii (8 * $20 = 256) -> $0e64
0e74 rts

;

0e75 cmp #$00           czy numer bitmapy do narysowania jest rwny 0?
0e77 bne $0e84          nie (bdzie rysowana bitmapa) -> $0e84
0e79 lda $0902          we wskanik poz./pion przy rysowaniu kolejnych bitmap
0e7c bne $0e81          jeli <> 0 (pion) -> nie czy pola 8x16
0e7e jmp $0f3a          Wyczy pole 8x16 pikseli i oblicz nast. adres kratki
0e81 jmp $0f12          Obl. adres dla nast. bitm. na podstawie wsk. pion/poz.

;

0e84 sta $cd            zapisz nr obrazka z bitmap 4x8 w komr. $cd (m. bajt)
0e86 lda #$00           0 zapisz w komrce $ce (starszy bajt)
0e88 sta $ce
0e8a asl $cd            pomn $cd,e przez 2
0e8c rol $ce
0e8e asl $cd            pomn $cd,e przez 2
0e90 rol $ce
0e92 lda $cd            dodaj do $cd,e liczb $7be0 - adres tablicy, ktrej
0e94 clc                cztebajtowe elementy s numerami bitmap 4x8
0e95 adc #$e0           skadajcymi si na obrazek
0e97 sta $cd
0e99 lda $ce
0e9b adc #$7b
0e9d sta $ce
0e9f lda $cb            zapamitaj $cb,c (adres w pamici obrazu) w $0900,1
0ea1 sta $0900
0ea4 lda $cc
0ea6 sta $0901
0ea9 ldy #$00           we spod adresu $cd,e numer pierwszej bitmapy 4x8
0eab lda ($cd),y
0ead jsr $0e44          narysuj bitmap 4x8 o numerze w A od adresu w cb,c
0eb0 jsr $0fae          Zwiksz o 1 $cd,e - nastpna bitmapa
0eb3 jsr $0fa0          Oblicz adres nastpnej kratki na znak
0eb6 ldy #$00           we spod adresu $cd,e numer drugiej bitmapy 4x8
0eb8 lda ($cd),y
0eba jsr $0e44          narysuj bitmap 4x8 o numerze w A od adresu w cb,c
0ebd jsr $0fae          Zwiksz o 1 $cd,e - nastpna bitmapa
0ec0 lda $0900          odczytaj adres w pamici obrazu z $0900,1 do $cb,c.
0ec3 sta $cb            Zwiksz starszy bajt adresu ($cc) o 1, aby uzyska
0ec5 ldy $0901          adres kratki lecej poniej kratki wypenionej na
0ec8 iny                pocztku (z piersz bitmap)
0ec9 sty $cc
0ecb lda $0903          we warto wskazujc na tryb drukowania obrazka
0ece cmp #$01           jeli = 1 -> $0ef2 (nie drukujemy bitmap poniej)
0ed0 beq $0ef2
0ed2 cmp #$02           jeli <> 2 (0) -> $0ede (drukuj bitmapy poniej)
0ed4 bne $0ede
0ed6 lda #$e0           ustaw $cd,e na adres $7be0 - pocztek tablicy numerw
0ed8 sta $cd            bitmap, aby odczytane za chwil dwa jej elementy byy
0eda lda #$7b           zerami
0edc sta $ce
0ede ldy #$00           we spod adresu $cd,e numer trzeciej bitmapy 4x8
0ee0 lda ($cd),y
0ee2 jsr $0e44          narysuj bitmap 4x8 o numerze w A od adresu w cb,c
0ee5 jsr $0fa0          Oblicz adres nastpnej kratki na znak
0ee8 jsr $0fae          Zwiksz o 1 $cd,e - nastpna bitmapa
0eeb ldy #$00           we spod adresu $cd,e numer czwartej bitmapy 4x8
0eed lda ($cd),y
0eef jsr $0e44          narysuj bitmap 4x8 o numerze w A od adresu w cb,c
0ef2 lda $0900          odczytaj adres w pamici obrazu z $0900,1 do $cb,c
0ef5 sta $cb
0ef7 lda $0901
0efa sta $cc
0efc lda $092d          we warto, ktra ma by zapisana do tablicy kolizji
0eff ldy #$00           bdziemy zapisywa dane w tablicy kolizji od indeksu 0
0f01 sta ($e3),y        zapisz warto do tablicy kolizji dla lewej kratki
0f03 iny                zwiksz indeks o 1 (kratka obok)
0f04 sta ($e3),y        zapisz warto do tablicy kolizji dla prawej kratki
0f06 ldx $0903          we do X warto wskazujc na tryb drukowania obrazka
0f09 bne $0f12          jeeli <> 0 -> $0f12 (drukujemy jeden wiersz)
0f0b ldy #$20           ustaw Y na indeks dla kratki pod pierwsz wypenion
0f0d sta ($e3),y        zapisz tak sam warto do tbl. kolizji w 2 wierszu
0f0f iny                nastpna kratka (obok)
0f10 sta ($e3),y        jeszcze raz zapisz tak sam warto

; Oblicz adres w pamici obrazu dla nastpnej bitmapy 4x8 w zalenoci od
; wskanika pion/poziom zawartego w komrce $0902

0f12 lda $0902          we wskanik poz./pion przy rysowaniu kolejnych bitmap
0f15 bne $0f6a          jeeli <> 0 (pion) -> $0f6a (nastpna bitmapa poniej)

; Oblicz adres dla bitmapy drukowanej z prawej strony bitmapy biecej

0f17 jsr $0fa0          Oblicz adres nastpnej kratki na znak
0f1a jsr $0fa0          Oblicz adres nastpnej kratki na znak
0f1d lda $e3            zwiksz $e3,4 o 2
0f1f clc
0f20 adc #$02
0f22 sta $e3
0f24 bcc $0f28
0f26 inc $e4
0f28 lda $cb            jeeli doszlimy do pierwszej kratki w linii
0f2a bne $0f39          (nastpio zawinicie), to przesu si do kratki
0f2c inc $cc            lecej w linii poniej
0f2e lda $e3            zwiksz $e3,4, aby wskazywao na adres w nast. linii
0f30 clc
0f31 adc #$20
0f33 sta $e3
0f35 bcc $0f39
0f37 inc $e4
0f39 rts

; Wyczy kwadrat 8x16 pikseli i oblicz adres dla nastpnej bitmapy na
; podstawie wska\nika pion/poziom

0f3a lda $cb            $cb,c -> $0900,1 (zapamitanie chwilowe adresu kratki)
0f3c sta $0900
0f3f lda $cc
0f41 sta $0901
0f44 jsr $0f59          wyczy na ekranie kwadrat 8x8 o adres. poc. w [$cb,c]
0f47 inc $cc            ustawiamy si na adresie kwadratu lecego poniej
0f49 jsr $0f59          wyczy na ekranie kwadrat 8x8 o adres. poc. w [$cb,c]
0f4c lda $0900          $0900,1 -> $cb,c (odczytanie zapamitanego adresu kr.)
0f4f sta $cb
0f51 lda $0901
0f54 sta $cc
0f56 jmp $0f12          Obl. adres dla nast. bitm. na podstawie wsk. pion/poz.

; Procedura czyci na ekranie kwadrat o wymiarach 8x8 pikseli, ktrego adres
; pocztkowy zapisano w [$cb,c].

0f59 ldy #$00           startujemy od pocztku
0f5b lda #$00           tym bdziemy wypenia
0f5d sta ($cb),y        lewa poowa
0f5f iny
0f60 sta ($cb),y        prawa poowa
0f62 tya
0f63 clc
0f64 adc #$1f           oblicz adres nastpnej linii (+31 do poprzedn. adresu)
0f66 tay
0f67 bne $0f5b          nastpuje 256/32 = 8 obrotw ptli
0f69 rts

; Oblicz adres dla bitmapy drukowanej poniej bitmapy biecej

0f6a inc $cc            zwiksz starszy bajt adresu w pamici obrazu o 2 by
0f6c inc $cc            uzyska adres o 2 kratki niej
0f6e lda $e3            w taki sam sposb zmodyfikuj adres elementu w tablicy
0f70 clc                kolizji
0f71 adc #$40
0f73 sta $e3
0f75 bcc $0f79          brak przeniesienia do starszego bajtu -> $0f79 (ok)
0f77 inc $e4            zwikszenie o 1 starszego bajtu adresu
0f79 lda $cc            we starszy bajt adresu w pamici obrazu
0f7b cmp #$9c           czy dojechalimy do koca widocznego obszaru gry?
0f7d bne $0f9c          nie -> $0f9c (rts)
0f7f lda #$88           ustaw starszy bajt adresu w pamici obrazu na $88
0f81 sta $cc            (pocztek)
0f83 lda $cb            przesu si w pamici obrazu o 2 kratki w prawo
0f85 clc                przeskakujc na lew stron ekranu w przypadku
0f86 adc #$02           przekroczenia liczby kratek w poziomie
0f88 and #$1f
0f8a sta $cb
0f8c lda $e3            przesu si w tablicy kolizji do elementu
0f8e clc                odpowiadajcego kratce ktrej adres przed chwil
0f8f adc #$02           obliczono (z przeskokiem na lew stron ekranu w razie
0f91 and #$1f           potrzeby
0f93 clc                te dwie instrunkcje to nop
0f94 adc #$00
0f96 sta $e3            zapisz modszy bajt adresu w tablicy kolizji
0f98 lda #$7d           ustaw starszy bajt adresu w tablicy kolizji na $7d
0f9a sta $e4            (pocztek)
0f9c rts

0f9d jsr $0fa0          Oblicz adres nastpnej kratki na znak

; Oblicz adres nastpnej kratki na znak

0fa0 lda $cb
0fa2 clc
0fa3 adc #$01           Dodaj 1 do $cb, lecz jeli znajdzie si tam ju
0fa5 and #$1f           wielokrotno 32, wwczas zwiksz $cc
0fa7 sta $cb
0fa9 bne $0fad
0fab inc $cc
0fad rts

; Zwiksz o 1 $cd,e

0fae inc $cd
0fb0 bne $0fb4
0fb2 inc $ce
0fb4 rts

; Wywietl du bitmap (w taki sposb jak procedura $0fc5) EOR-ujc jej
; piksele z pikselami ta

0fb5 pha
0fb6 lda #$51           Kod instrukcji EOR ($d1),Y
0fb8 ldy #$d1
0fba jmp $0fc9

; Wywietl du bitmap (w taki sposb jak procedura $0fc5) OR-ujc jej
; piksele z pikselami ta

0fbd pha
0fbe lda #$11           Kod instrukcji ORA ($d1),Y
0fc0 ldy #$d1
0fc2 jmp $0fc9

; Procedura wywietla du bitmap (A - nr, $0907, $0909 - modszy i starszy
; bajt jej offsetu wzgldem pocztku pamici obrazu)

0fc5 pha                numer bitmapy na stos
0fc6 lda #$ea           Kod 'nop'
0fc8 tay
0fc9 sta $103e          wstawiany jest do dwch komrek pamici za jsr
0fcc sty $103f
0fcf pla                numer bitmapy
0fd0 sta $cf            wstawiany jest do $cf
0fd2 lda $0907          modszy bajt miejsca na bitmap
0fd5 sta $d1            do $d1
0fd7 lda $0909          starszy bajt miejsca na bitmap (wzgldem pocztku
0fda clc                pamici obrazu
0fdb adc #$88
0fdd sta $d2
0fdf lda #$00
0fe1 sta $d0            $d0 = 00
0fe3 asl $cf            $cf,d0 = $cf,d0 * 4
0fe5 rol $d0
0fe7 asl $cf
0fe9 rol $d0
0feb lda $cf            inc($cf,d0, $4dab)
0fed clc
0fee adc #$ab
0ff0 sta $cf
0ff2 lda $d0
0ff4 adc #$4d
0ff6 sta $d0
0ff8 ldy #$00
0ffa lda ($cf),y        Pobierz spod adresu ($cf) cztery bajty do komrek
0ffc sta $0905          $905 (szeroko), $906 (wyskoko / 8), $cf i $d0
0fff iny                (adres pocztku bitmapy)
1000 lda ($cf),y
1002 sta $0906
1005 iny
1006 lda ($cf),y
1008 pha
1009 iny
100a lda ($cf),y
100c sta $d0
100e pla
100f sta $cf
1011 lda $0905          Jeeli szeroko = $ff,
1014 cmp #$ff
1016 bne $1020
1018 lda #$02           to jest to bitmapa 2 x (2 * 8) bajtw
101a sta $0905
101d sta $0906
1020 lda $0905          zapamitaj szeroko i wysoko na stosie
1023 pha
1024 lda $0906
1027 pha
1028 asl $0906          wyskoko := wysoko * 8
102b asl $0906
102e asl $0906
1031 ldy #$00
1033 ldx $0905          Szeroko bitmapy w bajtach
1036 lda $d1            Modszy bajt przeznaczenia
1038 pha                na stos
1039 lda ($cf),y        Pobierz bajt bitmapy
103b jsr $0e15          Uwzgldnij aktualn palet kolorw
103e nop                W tym miejscu moe zosta wstawiona instrukcja:
103f nop                EOR ($d1),Y lub ORA ($d1),Y
1040 sta ($d1),y        Wstaw bajt pod waciwy adres
1042 jsr $108a          Zwiksz o 1 $cf,d0
1045 inc $d1            Nastpny bajt
1047 dex
1048 bne $1039          czy koniec wiersza?
104a pla                Odtwrz stare $d1
104b clc                nastpna linia
104c adc #$20
104e sta $d1
1050 dec $0906          czy wywietlono ju wszystkie wiersze?
1053 beq $1061          Jeli tak, to wyskocz z ptli
1055 lda $0906          Jeli wywietlono ju wielokrotno 8 wierszy,
1058 and #$07
105a bne $1033
105c inc $d2            dodaj 256 do adresu (8 * $20 = 256)
105e jmp $1033          wywietl pozosta cz bitmapy

; Ustaw w tablicy kolizji elementy odpowiadajce narysowanej wanie bitmapie
; pobierajc bajt do zapisania z komrki $092d

1061 ldx $0907          we do X i Y m. i st. bajt offs. bitm. wzg. pam. obr.
1064 ldy $0909          s rwnie wsprzdne kratkowe
1067 jsr $2628          Oblicz w e3,4 adres elem. z tabl. kolizji dla pozycji
106a pla                we ze stosu wysoko bitmapy (wstawion wczeniej)
106b tax                do X
106c pla                we ze stosu szeroko bitmapy (wstawion wczeniej)
106d sta $1071          ustaw jako argument ldy (poniej)
1070 ldy #$00           argument 'ldy' zosta ustawiony na szeroko bitmapy
1072 dey                liczymy do zera i dlatego zmniejszamy t warto o 1
1073 lda $092d          we bajt bdcy elementem zapisywanym w tabl. kolizji
1076 sta ($e3),y        zapisz element do tablicy
1078 dey                zmniejsz o 1 szeroko
1079 bpl $1076          jeli <> $ff -> $1076 (wpisz dalsze elem. tej linii)
107b lda $e3            zwiksz $e3,4 o $20 by uzyska adres elementu z tabl.
107d clc                kolizji odpowiadajcy kratce poniej
107e adc #$20
1080 sta $e3
1082 bcc $1086
1084 inc $e4
1086 dex                zmniejsz o 1 wysoko bitmapy
1087 bne $1070          jeeli <> 0 -> $1070 (wpisuj elementy dla nast. linii)
1089 rts

; Zwiksz o 1 $cf,d0

108a inc $cf
108c bne $1090
108e inc $d0
1090 rts

; Kod $e7 - Ustaw tryb drukowania bitmap 8x8

1091 lda #$01           wcz tryb drukowania bitmap 8x8
1093 jmp $1098          ustaw ten tryb i czytaj dane lokacji

; Kod $e8 - Ustaw tryb drukowania bitmap 8x16 z pust doln czci

1096 lda #$02           wcz tryb drukowania bitmap 8x16 z pust doln
1098 sta $0903          czci
109b jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.

; Kod $e9 - Ustaw, e na rysowany obiekt MK bdzie mg wskoczy

109e lda #$c0           Element wpisywany do tablicy kolizji bdzie oznacza,
10a0 sta $092d          e na narysowany obiekt bdzie mona wskoczy
10a3 jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.

; Kod $ea - Ustaw, e na rysowany obiekt MK bdzie mg wskoczy i nie bdzie
; mg przez niego przej

10a6 lda #$e0           Na narysowany obiekt bdzie mona wskoczy i nie
10a8 sta $092d          bdzie mona przez niego przej
10ab jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.

; Kod $eb - Ustaw przezroczysto rysowanego obiektu

10ae lda #$40           Element wpisywany do tablicy kolizji bdzie oznacza,
10b0 sta $092d          e narysowany obiekt jest przezroczysty dla MK
10b3 jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.

; Kod $ec - Narysuj lewy wiecznik pobierajc jego wsprzdne z kolejnych
; bajtw opisu lokacji

10b6 jsr $12a7          We 2 bajty z [$d3,4] + 1 i zapisz w $0907-8 i $0909-a
10b9 lda #$40           Element wpisywany do tablicy kolizji bdzie oznacza,
10bb sta $092d          e narysowany obiekt jest przezroczysty dla MK
10be lda #$38           we nr bitmapy - przedu. kinkietu umocow. "z lewej"
10c0 jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
10c3 ldx $090a          we wsprzdn Y przeduenia kinkietu
10c6 inx                +3
10c7 inx
10c8 inx
10c9 stx $0909          bdzie to wsprzdna Y kinkietu
10cc lda #$37           we nr bitmapy - kinkiet umocowany z lewej strony
10ce jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
10d1 ldx $090a          we wsprzn Y przeduenia kinkietu
10d4 dex                -1
10d5 stx $0909          bdzie to wsprzdna Y wieczki w naczynku
10d8 ldx $0908          we wsprzdn X przeduenia kinkietu
10db inx                -1
10dc stx $0907          bdzie to wsprzdna X wieczki w naczynku
10df lda #$36           we nr bitmapy odpowiadajcy wieczce w naczynku
10e1 jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
10e4 jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.

; Kod $ed - Narysuj prawy wiecznik pobierajc jego wsprzdne z kolejnych
; bajtw opisu lokacji

10e7 jsr $12a7          We 2 bajty z [$d3,4] + 1 i zapisz w $0907-8 i $0909-a
10ea lda #$40           Element wpisywany do tablicy kolizji bdzie oznacza,
10ec sta $092d          e narysowany obiekt jest przezroczysty dla MK
10ef lda #$3a           we nr bitmapy - przedu. kinkietu umocow. "z prawej"
10f1 jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
10f4 ldx $090a          we wsprzdn Y przeduenia kinkietu
10f7 inx                +3
10f8 inx
10f9 inx
10fa stx $0909          bdzie to wsprzdna Y kinkietu
10fd ldx $0908          we wsprzdn X przeduenia kinkietu
1100 dex                -2
1101 dex
1102 stx $0907          bdzie to wsprzdna X kinkietu
1105 lda #$39           we nr bitmapy - kinkiet umocowany z prawej strony
1107 jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
110a ldx $090a          we wsprzdn Y przeduenia kinkietu
110d dex                -1
110e stx $0909          bdzie to wsprzdna Y wieczki w naczynku
1111 ldx $0908          we wsprzdn X przeduenia kinkietu
1114 dex                -2
1115 dex
1116 stx $0907          bdzie to wsprzdna X wieczki w naczynku
1119 lda #$36           we nr bitmapy odpowiadajcy wieczce w naczynku
111b jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
111e jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.

; Kod $ee - Zaznacz na tabliczce w windzie numer pitra, na ktrym winda stoi

1121 jsr $12a7          We 2 bajty z [$d3,4] + 1 i zapisz w $0907-8 i $0909-a
1124 inc $0907          zwiksz o 1 wsprzdn X tabliczki w windzie
1127 inc $0909          zwiksz o 1 wsprzdn Y tabliczki w windzie
112a lda $0927          we nr pitra, na ktrym jest winda, liczony od zera
112d clc                dodaj zwikszon o 1 wsprzdn Y tabliczki
112e adc $0909
1131 tay                bdzie to wsprzdna Y kratki w pamici obrazu
1132 ldx $0907          wsprzdn X bdzie zwikszona o 1 wsp. X tabliczki
1135 jsr $1307          Oblicz adres w pamici obr. na podstawie przesunicia
1138 ldy #$40           bdziemy wypenia bajt lecy o 2 linie poniej
113a lda #$54           jest to bajt wypenienia, ustawiamy 3 piksele
113c sta ($cb),y        zapisz bajt
113e ldy #$60           bdziemy wypenia bajt lecy o 3 linie poniej
1140 sta ($cb),y        zapisz bajt
1142 ldy #$80           bdziemy wypenia bajt lecy o 4 linie poniej
1144 sta ($cb),y        zapisz bajt
1146 ldy #$a0           bdziemy wypenia bajt lecy o 5 linii poniej
1148 sta ($cb),y        zapisz bajt
114a jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.

; Kod $ef - Wywietl bitmap - obraz z zamkiem pobierajc jego wsprzdne z
; kolejnych bajtw opisu lokacji

114d jsr $12a7          We 2 bajty z [$d3,4] + 1 i zapisz w $0907-8 i $0909-a
1150 lda #$40           Element wpisywany do tablicy kolizji bdzie oznacza,
1152 sta $092d          e narysowany obiekt jest przezroczysty dla MK
1155 lda #$3c           we nr bitmapy - obrazu z zamkiem
1157 jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
115a jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.

; Kod $f0 - Wywietl bitmap - obraz z drzewem pobierajc jego wsprzdne z
; kolejnych bajtw opisu lokacji. Obraz powstaje w taki sposb, e rysowany
; jest najpierw obraz zamku w ramie a nastpnie drugi raz rysowany jest rodek.

115d jsr $12a7          We 2 bajty z [$d3,4] + 1 i zapisz w $0907-8 i $0909-a
1160 lda #$40           Element wpisywany do tablicy kolizji bdzie oznacza,
1162 sta $092d          e narysowany obiekt jest przezroczysty dla MK
1165 lda #$3c           we nr bitmapy - obrazu z zamkiem
1167 jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
116a ldx $090a          we wsprzdn Y obrazu z zamkiem
116d inx                +1 (ominicie ramy)
116e stx $0909          jest to starszy bajt offs. bitm. wzg. pocz. pam. obr.
1171 ldx $0908          we wsprzdn Y obrazu z zamkiem
1174 inx                -1
1175 stx $0907          jest to modszy bajt offs. bitm. wzg. pocz. pam. obr.
1178 lda #$3e           we nr bitmapy - drzewa
117a jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
117d jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.

; Kod $f1 - Wywietl bitmap - obraz z gr i drog pobierajc jego wsprzdne
; z kolejnych bajtw opisu lokacji

1180 jsr $12a7          We 2 bajty z [$d3,4] + 1 i zapisz w $0907-8 i $0909-a
1183 lda #$40           Element wpisywany do tablicy kolizji bdzie oznacza,
1185 sta $092d          e narysowany obiekt jest przezroczysty dla MK
1188 lda #$3b           we nr bitmapy - obrazu gr i drog
118a jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
118d jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.

; Kod $f2 - Narysuk obraz z gr i drog

1190 jsr $12a7          We 2 bajty z [$d3,4] + 1 i zapisz w $0907-8 i $0909-a
1193 lda #$40           Element wpisywany do tablicy kolizji bdzie oznacza,
1195 sta $092d          e narysowany obiekt jest przezroczysty dla MK
1198 lda #$3b           we nr bitmapy - obrazu gr i drog
119a jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
119d ldx $090a          we wsprzdn Y obrazu z gr i drog
11a0 inx                -2
11a1 inx
11a2 stx $0909          bdzie to wsprzdna Y gr
11a5 ldx $0908          we wsprzdn X obrazu z gr i drog
11a8 inx                -1
11a9 stx $0907          bdzie to wsprzdna X gr
11ac lda #$3d           we nr bitmapy - gr
11ae jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
11b1 jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.

; Kod $f3 - Procedura pobiera z danych lokacji wsprzdne okienka do
; narysowania a nastpnie nr bitmapy. Na ekranie rysowane jest okienko o
; numerze $a, tak aby otaczao bitmap, ktra nastpnie te jest rysowana.

11b4 jsr $12a7          We 2 bajty z [$d3,4] + 1 i zapisz w $0907-8 i $0909-a
11b7 jsr $12c0          Zwiksz o 1 $d3,4
11ba ldy #$00           we bajt spod [$d3,4]
11bc lda ($d3),y
11be sta $090b          bdzie to numer bitmapy do wywietlenia
11c1 jsr $12c0          Zwiksz o 1 $d3,4
11c4 jsr $16c2          Narysuj okienko $a otaczajc bitmap o numerze w $090b
11c7 ldx $0908          we wsprzdn X lewego grnego rogu okienka
11ca inx                +1 (bdzie to wsp. X lewego grnego rogu obrazka)
11cb stx $0907          zapisz jako modszy bajt offsetu dla bitmapy
11ce ldx $090a          we wsprzdn Y lewego grnego rogu okienka
11d1 inx                +1 (bdzie to wsp. Y lewego grnego rogu obrazka)
11d2 stx $0909          zapisz jako modszy bajt offsetu dla bitmapy
11d5 lda #$40           Element wpisywany do tablicy kolizji bdzie oznacza,
11d7 sta $092d          e narysowany obiekt jest przezroczysty dla MK
11da lda $090b          we nr bitmapy do wywietlenia
11dd jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
11e0 jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.

; Kod $f4 - Procedura czyta w ptli po dwa bajty z danych lokacji zapisujc je
; jako wsprzdne duej bitmapy do narysowania. Czytanie koczy si, gdy
; pierwszy przeczytany bajt bdzie rwny $f4 - drugi bajt nie jest wtedy
; odczytywany. Po wyjciu z ptli wsprzdne s zatem pobrane z dwch bajtw
; przed kocowym bajtem o kodzie $f4.

11e3 jsr $12c0          Zwiksz o 1 $d3,4
11e6 ldy #$00           we bajt danych lokacji
11e8 lda ($d3),y
11ea cmp #$f4           jeeli rny od $f4 -> $11f1 (odczytaj wsp. bitmapy)
11ec bne $11f1
11ee jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.
11f1 jsr $12c7          Zmniejsz o 1 $d3,4
11f4 jsr $12a7          We 2 bajty z [$d3,4] + 1 i zapisz w $0907-8 i $0909-a
11f7 jmp $11e3          skok na pocz. ptli, czytaj dalej dane czekajc na $f4

; Kod $f5 - Procedura czyta w ptli po trzy bajty z danych lokacji zapisujc
; drugi i trzeci bajt jako wsprzdne duej bitmapy do narysowania. Czytanie
; koczy si, gdy pierwszy przeczytany bajt bdzie rwny $f5 - drugi i trzeci
; bajt nie s wtedy odczytywane. Po wyjciu z ptli wsprzdne s zatem
; pobrane z drugiego i trzeciego bajtu z ostatniej przeczytanej trjki bajtw.

11fa jsr $12c0          Zwiksz o 1 $d3,4
11fd ldy #$00           we bajt danych lokacji
11ff lda ($d3),y
1201 cmp #$f5           jeeli rny od $f5 -> $1208 (odczytaj wsp. bitmapy)
1203 bne $1208
1205 jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.
1208 jsr $12a7          We 2 bajty z [$d3,4] + 1 i zapisz w $0907-8 i $0909-a
120b jmp $11fa          skok na pocz. ptli, czytaj dalej dane czekajc na $f5

; Kod $f6 - Narysuj toporki odczytujc wczeniej z danych lokacji ich
; wsprzdne

120e jsr $12a7          We 2 bajty z [$d3,4] + 1 i zapisz w $0907-8 i $0909-a
1211 lda #$40           Element wpisywany do tablicy kolizji bdzie oznacza,
1213 sta $092d          e narysowany obiekt jest przezroczysty dla MK
1216 lda #$56           we nr bitmapy - toporkw
1218 jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
121b jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.

; Kod $f7 - Narysuj wiecznik powieszony od gry odczytujc wczeniej z danych
; lokacji jego wsprzdne

121e jsr $12a7          We 2 bajty z [$d3,4] + 1 i zapisz w $0907-8 i $0909-a
1221 lda #$40           Element wpisywany do tablicy kolizji bdzie oznacza,
1223 sta $092d          e narysowany obiekt jest przezroczysty dla MK
1226 lda #$60           we nr bitmapy - wiecznika powieszonego "od gry"
1228 jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
122b jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.

; Kod $fa - Pobierz z kolejnych bajtw opisu lokacji wsprzdne kratki i oblicz
; na ich podstawie adres w pamici obrazy oraz adres elementu w tablicy kolizji

122e jsr $12a7          We 2 bajty z [$d3,4] + 1 i zapisz w $0907-8 i $0909-a
1231 ldx $0907          we odczytan wsprzdn X do X
1234 ldy $0909          we odczytan wsprzdn Y do Y
1237 jsr $1307          Oblicz adres w pamici obr. na podstawie przesunicia
123a ldx $0907          ponownie we odczytan wsprzdn X do X
123d ldy $0909          ponownie we odczytan wsprzdn Y do Y
1240 jsr $2628          Oblicz w e3,4 adres elem. z tabl. kolizji dla pozycji
1243 jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.

; Kod $fb - Narysuj du bitmap OR-ujc jej piksele z pikselami ta.
; Wsprzdne bitmapy, uywan palet oraz bajt wpisywany do tablicy kolizji
; pobierz z kolejnych bajtw opisu lokacji.

1246 jsr $12a7          We 2 bajty z [$d3,4] + 1 i zapisz w $0907-8 i $0909-a
1249 jsr $12c0          Zwiksz o 1 $d3,4
124c ldy #$00           We bajt opisu bdcy palet
124e lda ($d3),y
1250 jsr $0dea          Przetwrz palet na kody poszczeglnych kolorw
1253 jsr $12c0          Zwiksz o 1 $d3,4
1256 ldy #$00           We bajt bdcy elem. wpisywanym do tablicy kolizji
1258 lda ($d3),y
125a sta $092d          zapisz go do kom., z ktrej odczyta go proc. rysujca
125d jsr $12c0          Zwiksz o 1 $d3,4
1260 ldy #$00           We bajt opisu bdcy numerem bitmapy
1262 lda ($d3),y
1264 jsr $0fbd          wywietl du bitmap OR-ujc jej piks. z piks. ta
1267 lda #$e4
1269 jsr $0dea          Przetwrz palet ($e4) na kody poszczeglnych kolorw
126c jmp $13dc          Zw. o 1 $d3,4 i skocz na pocz. ptli czyt. dane lok.

; Kod $fe - Odczytuj numery maych bitmap i rysuj je.

126f jsr $12c0          Zwiksz o 1 $d3,4
1272 jsr $12c0          Zwiksz o 1 $d3,4
1275 ldy #$00           We bajt bdcy numerem maej bitmapy do narysowania
1277 lda ($d3),y			lub znacznikiem koca
1279 cmp #$fe           jeeli <> $fe (jest to numer bitmapy) -> $1280 (rysuj)
127b bne $1280
127d jmp $13d7          Wcz domy. tryb druk. bitmap, czytaj dalej dane lok.
1280 jsr $0e75          Narysuj ma bitmap o numerze podanym w A
1283 jmp $1272          kontynuuj odczytywanie numerw

; Kod $ff - Nieuywane rysowanie maych bitmap

1286 jsr $12c0          Zwiksz o 1 $d3,4
1289 ldy #$00           We bajt bdcy numerem maej bitmapy do narysowania
128b lda ($d3),y
128d cmp #$ff           czy jest on rwny $ff (koniec)?
128f bne $1294          nie -> $1294 (bdziemy drukowa)
1291 jmp $13d7          Wcz domy. tryb druk. bitmap, czytaj dalej dane lok.
1294 sta $090b          zapisz numer bitmapy do narysowania w komrce pomocn.
1297 cmp #$00           czy jest on rwny 0?
1299 beq $129e          nie -> przesk. nast. bajt opisu, tak -> nie przeskakuj
129b jsr $12c0          Zwiksz o 1 $d3,4
129e lda $090b          we numer bitmapy do narysowania z komrki pomocniczej
12a1 jsr $0e75          Narysuj ma bitmap o numerze podanym w A
12a4 jmp $1286          Skok na pocztek - czytaj i rysuj kolejne bitmapy

; We 2 bajty od adresu [$d3,4] + 1. Zapisz je w $0907,8 (pierwszy) i
; $0909,a (drugi).

12a7 jsr $12c0          Zwiksz o 1 $d3,4
12aa ldy #$00
12ac lda ($d3),y
12ae sta $0907
12b1 sta $0908
12b4 jsr $12c0          Zwiksz o 1 $d3,4
12b7 lda ($d3),y
12b9 sta $0909
12bc sta $090a
12bf rts

; Zwiksz o 1 $d3,4

12c0 inc $d3
12c2 bne $12c6
12c4 inc $d4
12c6 rts

; Zmniejsz o 1 $d3,4

12c7 lda $d3
12c9 sec
12ca sbc #$01
12cc sta $d3
12ce bcs $12d2
12d0 dec $d4
12d2 rts

12d3 dta a($1467) ; e6 - Usta tryb pionowy
     dta a($1091) ; e7 - Ustaw tryb drukowania bitmap 8x8
     dta a($1096) ; e8 - Ustaw tryb drukowania bitmap 8x16 z pust doln czci
     dta a($109e) ; e9 - Ustaw, e na rysowany obiekt MK bdzie mg wskoczy
     dta a($10a6) ; ea - Ustaw, e na rysowany obiekt MK bdzie mg wskoczy
     dta a($10ae) ; eb - Ustaw, e rysowany obiekt jest przezroczysty dla MK
     dta a($10b6) ; ec - Narysuj lewy wiecznik
     dta a($10e7) ; ed - Narysuj prawy wiecznik
     dta a($1121) ; ee - Zaznacz na tabl. w windzie pitro na ktrym winda stoi
     dta a($114d) ; ef - Wywietl bitmap - obraz z zamkiem
     dta a($115d) ; f0 - Wywietl bitmap - obraz z drzewem
     dta a($1180) ; f1 - Wywietl bitmap - obraz z gr i drog
     dta a($1190) ; f2 - Narysuj obraz z gr i drog
     dta a($11b4) ; f3 - Narysuj okienko o numerze $a otaczajce bitmap
     dta a($11e3) ; f4 - Ustaw wsp. duej bitmapy czekajc na bajt o kodzie $f4
     dta a($11fa) ; f5 - Ustaw wsp. duej bitmapy czekajc na bajt o kodzie $f5
     dta a($120e) ; f6 - Narysuj toporki
     dta a($121e) ; f7 - Narysuj wiecznik powieszony od gry
     dta a($13b6) ; f8 - Narysuj wielokrotnie ma bitmap
     dta a($13b6) ; f9 - Narysuj wielokrotnie ma bitmap
     dta a($122e) ; fa - Pobierz wsp. kratki i obl. adres w pam. obr i tab. kol.
     dta a($1246) ; fb - Narysuj du bitmap OR-ujc jej piksele z piks. ta
     dta a($13b6) ; fc - Narysuj wielokrotnie ma bitmap
     dta a($13b6) ; fd - Narysuj wielokrotnie ma bitmap
     dta a($126f) ; fe - Odczytaj numery maych bitmap i rysuj je
     dta a($1286) ; ff - Rysuj mae bitmapy

; Oblicz adres komrki pamici obrazu (X - modszy adres przesunicia,
; Y - starszy adres przesunicia, $cb,c -> wynik)

1307 stx $cb            Oblicz adres w pamici obr. na podstawie przesunicia
1309 tya
130a clc
130b adc #$88
130d sta $cc
130f rts

; Narysuj lokacj o numerze podanym w A

1310 sta $090d          wstaw numer lokacji do $090d (lokacja Magic Knighta)
1313 dec $03fd          Zmniejsz o 1 si Magic Knighta
1316 lda $03fd          czy sia jest rwna 0?
1319 bne $1322          nie -> przeskocz drukowanie tekstu
131b ldx #$9e           drukuj "YOU DIED OF EXHAUSTION..." i zakocz gr
131d ldy #$52
131f jmp $2c49
1322 lda $090d          Niech X = lokacja / 8 (numer pitra liczony od zera)
1325 lsr @
1326 lsr @
1327 lsr @
1328 tax
1329 lda $090d          Niech Y = lokacja mod 8 (numer lokacji na pitrze)
132c and #$07
132e tay
132f lda #$01           Oblicz: A = 2 ^ Y - (maska do bajtu w tablicy $093c
1331 cpy #$00                                odpowiadajcego danej lokacji)
1333 beq $133a
1335 asl @
1336 dey
1337 jmp $1333

133a ora $093c,x        zaznacz w tabeli odwiedzonych pomieszcze, e dan
133d sta $093c,x        lokacj odwiedzi Magic Knight
1340 lda #$20           we kod spacji
1342 sta $2050          zapisz go jako numer bitmapy przypisanej wszystkim
1345 sta $2058          pieczkom, ktre mog wystpowa w niektrych
1348 sta $2060          lokacjach
134b sta $2068
134e lda #$e0           Na narysowany obiekt bdzie mona wskoczy i nie
1350 sta $092d          bdzie mona przez niego przej
1353 lda #$e4
1355 jsr $0dea          Przetwrz palet ($e4) na kody poszczeglnych kolorw
1358 lda #$00           [$30,1] = $7d00 - pocztek tablicy kolizji
135a sta $30
135c lda #$7d
135e sta $31
1360 ldy #$00           wyzeruj obszar $7d00, $7fff - tablic kolizji
1362 lda #$00
1364 sta ($30),y
1366 iny
1367 bne $1364
1369 inc $31
136b lda $31
136d cmp #$80
136f bne $1362
1371 lda #$00           [$e3,4] = $7d00 - ustawiamy si w tablicy kolizji na
1373 sta $e3                              pierwszym elemencie
1375 lda #$7d
1377 sta $e4
1379 lda #$00           [$cb,c] = $8800 - adres pierwszej kratki w pamici
137b sta $cb                              obrazu
137d lda #$88
137f sta $cc
1381 lda #$00           ustaw HELP STATUS Magic Knighta na 0 (bo nie pomaga)
1383 sta $0902
1386 sta $0903          i jego SLEEP STATUS na 0 (jest obudzony)
1389 lda $090d          we numer lokacji Magic Knighta
138c asl @              * 2
138d tax
138e lda $714d,x        we adres pocztku danych lokacji z tablicy $714d,
1391 sta $d3            po czym zapisz go w $d3,4
1393 lda $714e,x
1396 sta $d4

1398 ldy #$00           we bajt danych lokacji spod [$d3,4]
139a lda ($d3),y
139c beq $13e2          jeli rwny 0 -> koniec
139e cmp #$a0
13a0 bcc $13b6          jeli < $a0 -> $13b6 (rysuj wielokrotnie ma bitmap)
13a2 sec
13a3 sbc #$e6           A -= $e6
13a5 asl @              *2
13a6 tax                we adres z tablicy $12d3 na podstawie indeksu w A
13a7 lda $12d3,x
13aa sta $13b4
13ad lda $12d4,x
13b0 sta $13b5
13b3 jmp $0000          wykonaj skok pod ten adres!

; Kody $f8, $f9, $fd, $fe - Narysuj wielokrotnie ma bitmap. Nr bitmapy oraz
; liczba powtrze odczytywane s jako kolejne bajty opisu lokacji

13b6 sta $090c          pierwszy przeczytany bajt do $090c - liczba powtrze
13b9 jsr $12c0          Zwiksz o 1 $d3,4
13bc ldy #$00
13be lda ($d3),y        we drugi bajt - numer bitmapy do narysowania
13c0 sta $090b          zapisz go w $090b
13c3 beq $13cc          jeeli = 0 -> $13cc (nie jest pobierany nastpny bajt)
13c5 jsr $12c0          Zwiksz o 1 $d3,4
13c8 ldy #$00           we kolejny bajt opisu, ale nie wykorzystaj go
13ca lda ($d3),y
13cc lda $090b          we numer bitmapy do narysowania
13cf jsr $0e75          Narysuj ma bitmap o numerze podanym w A
13d2 dec $090c          zmniejsz o 1 liczb powtrze
13d5 bne $13cc          <> 0 -> $13cc (rysujemy dalej)
13d7 lda #$00           Wcz tryb drukowania penych bitmap 8x16
13d9 sta $0903
13dc jsr $12c0          Zwiksz o 1 $d3,4
13df jmp $1398          skok na pocztek ptli czytajcej dane lokacji

13e2 jsr $1599          drukuj nazw lokacji w ktrej znajduje si MK
13e5 lda #$0f           Rysuj okienko nr. $0f
13e7 jsr $1727
13ea lda #$72           ustaw $d5,6 na adres tekstu "SPELLBOUND ... COPYRIGHT"
13ec sta $d5
13ee lda #$4f
13f0 sta $d6
13f2 lda #$23           Czy Magic Knight ma Mirror?
13f4 jsr $18eb
13f7 bne $1401          nie ma -> $1401 (drukuj tekst ktry ustawiono)
13f9 lda #$71           wydrukuj tekst '* STRENGTH...' (adres tekstu: $5271)
13fb sta $d5
13fd lda #$52
13ff sta $d6
1401 jsr $148f
1404 jsr $18fb          Rysuj pasek energii (jeli Magic Knight ma Mirror)
1407 jsr $1940          Narysuj niesione przedmioty, jeeli MK niesie Mirror
140a jsr $2c34          ustaw adres procedury wykonywanej w lok. i ustaw menu
140d jsr $1997          Narysuj przedmioty znajdujce si w lokacji MK
1410 jsr $1c24          ustaw ciank dziaow w lokacji "przy windzie"
1413 lda #$00           ustaw w $0447 numer poprzedniej bitmapy przypisanej MK
1415 sta $0447
1418 jsr $281f          ustal nr bitmapy przypisanej Magic Knightowi
141b lda $0928          jeeli MK ma pojawi si w dymku -> $1423
141e bne $1423          (przeskocz jego rysowanie)
1420 jsr $2641          Narysuj Magic Knighta
1423 jsr $1846          rysuj wszystkie postaci w lokacji Magic Knighta
1426 lda $0947          odblokuj losowe przemieszczanie si postaci
1429 ora #$02
142b sta $0947
142e lda $0928          jeeli MK ma pojawi si nie w dymku -> $145b
1431 beq $145b          (przeskok rysowania dymka)
1433 lda $0445          we aktualn poz. X Magic Knigtha w piks. trybu gr. 8
1436 lsr @              /8
1437 lsr @
1438 lsr @
1439 sta $0907          bdzie to modszy bajt offs. wzgldem pocz. pam. obr.
143c lda $0446          we aktualn pozycj Y MK w pikselach trybu gr. 8
143f lsr @              /8
1440 lsr @
1441 lsr @
1442 sta $0909          bdzie to starszy bajt offs. wzgldem pocz. pam. obr.
1445 lda #$3f           w na stos numer pocztkowej bitmapy MK (dymek)
1447 pha
1448 jsr $0fb5          wywietl du bitmap eorujc jej piks. z piks. ta
144b jsr $2249          odczekaj 1/5 sekundy
144e pla                nie zmieniajc stosu odczytaj z niego numer bitmapy MK
144f pha
1450 jsr $0fb5          wywietl du bitmap eorujc jej piks. z piks. ta
1453 pla                we ze stosu numer bitmapy Magic Knighta
1454 clc                +1
1455 adc #$01
1457 cmp #$45           czy wywietlono ju bitmap ostatni (caa posta)
1459 bne $1447          nie -> $1447 (kontunuacja wywietlania)
145b jsr $2641          Narysuj Magic Knighta
145e lda #$00           ustaw tryb normalnego pojawiania si MK (nie w dymku)
1460 sta $0928
1463 lda $090d          we nr lokacji przypisanej Magic Knightowi
1466 rts

; Kod $e6 - Ustaw tryb pionowy

1467 lda #$01           ustaw wskanik poz./pion na "pion" dla kolejnych
1469 sta $0902          bitmap, ktre maj by rysowane
146c lda #$00           [$cb,c] = $8800 - pocztek pamici obrazu
146e sta $cb
1470 lda #$88
1472 sta $cc
1474 lda #$00           [$e3,4] = $7d00 - pocztek tablicy kolizji
1476 sta $e3
1478 lda #$7d
147a sta $e4
147c jmp $13d7          Wcz domy. tryb druk. bitmap, czytaj dalej dane lok.

; Przeskocz PString zapisany w pamici (adres w komrkach $d5,6)

147f ldy #$00
1481 lda ($d5),y
1483 jsr $1589          Zwiksz o 1 $d5,6
1486 cmp #$00
1488 bne $147f
148a rts

; Drukuj tekst w ramce. X, Y - modszy i starszy bajt adresu tekstu, $cb,c -
; adres miejsca w pamici ekranu, od ktrego rozpocznie si drukowanie

148b stx $d5            Modszy bajt tekstu
148d sty $d6            Starszy bajt tekstu
148f jsr $157d          Zmniejsz o 1 $d5,6
1492 jsr $1589          Zwiksz o 1 $d5,6
1495 ldy #$00
1497 lda ($d5),y
1499 beq $14cd          Koniec tekstu
149b cmp #$09           znak = $09 -> skok do nastpnej kratki (spacja)
149d beq $151d
149f cmp #$0d           znak = $0d -> skok na pocztek nastpnego wiersza
14a1 beq $14ce
14a3 cmp #$0e           znak = $0e -> skok na pocztek nastpnego wiersza
14a5 beq $14d4          w okienku
14a7 cmp #$10           znak = $10 -> nowa paleta kolorw
14a9 beq $1510
14ab cmp #$11           znak = $11, $12, $13 -> przeskocz nastpny znak
14ad beq $150a
14af cmp #$12
14b1 beq $150a
14b3 cmp #$13
14b5 beq $150a
14b7 cmp #$1d           znak = $1d -> drukuj nazw przedmiotu, ktrego numer
14b9 beq $1523                        podany jest w $2d66
14bb cmp #$1e           znak = $1e -> drukuj pen nazw postaci o numerze
14bd beq $1537                        podanym w $0913
14bf cmp #$1f           znak = $1f -> drukuj skrcon nazw postaci o numerze
14c1 beq $1540                        podanym w $0913
14c3 cmp #$5b           jeli znak >= $5b to drukuj tekst o tym numerze
14c5 bcs $14e2
14c7 jsr $1549          Drukuj znak w A od adresu ($cb)
14ca jmp $1492          Nastpny znak
14cd rts

; Znak o kodzie $0d

14ce jsr $1592          Przeskok na pocztek nastpnego wiersza ekranowego
14d1 jmp $1492          Nastpny znak

; Znak o kodzie $0e

14d4 jsr $1592          Przeskok na pocztek nastpnej linii
14d7 lda $cb            Skok do kratki najbliszej lewej krawdzi okienka
14d9 clc
14da adc $090e          pozycja lewej krawdzi okienka
14dd sta $cb
14df jmp $1492          Nastpny znak

; Drukuj tekst o numerze podanym w akumulatorze

14e2 tax
14e3 lda $d5
14e5 pha
14e6 lda $d6
14e8 pha
14e9 lda #$06           $4404 - pocztek tablicy ze sowami czsto
14eb sta $d5                    wystpujcymi w rnych tekstach
14ed lda #$44
14ef sta $d6
14f1 txa
14f2 sec
14f3 sbc #$5b           jeli A = $5b, to jest to pierwszy tekst
14f5 beq $14fe
14f7 tax
14f8 jsr $147f          przeskocz jeden PString o pocztku w $d5,6
14fb dex
14fc bne $14f8          skok do nastpnego tekstu

14fe jsr $148f          Drukuj tekst, ktrego adres jest w $d5,6
1501 pla
1502 sta $d6
1504 pla
1505 sta $d5
1507 jmp $1492          Drukuj nastpne znaki

; Znak o kodzie $11, $12, $13

150a jsr $1589          Zwiksz o 1 $d5,6
150d jmp $1492

; Znak o kodzie $10

1510 jsr $1589          Zwiksz o 1 $d5,6
1513 ldy #$00
1515 lda ($d5),y        We now palet kolorw
1517 jsr $0dea          rozbij j na kody poszczeglnych kolorw
151a jmp $1492          Nastpny znak

; Kod znaku $09

151d jsr $0fa0          Oblicz adres nastpnej kratki na znak
1520 jmp $1492          Drukuj nastpne znaki

1523 lda $d5            $d5,6 na stos
1525 pha
1526 lda $d6
1528 pha
1529 lda #$5c           $485c = pocztek tablicy nazw przedmiotw
152b sta $d5
152d lda #$48
152f sta $d6
1531 lda $2d66          we z $2d66 numer przedmiotu, ktrego nazwa ma zosta
1534 jmp $14f5          wydrukowana, drukuj j, potem odtwrz $d5,6 ze stosu

; Drukuj pen nazw postaci (numer znajduje si w $0913).
; (0 = GIMBAL THE WIZARD)

1537 lda $0913
153a clc
153b adc #$75
153d jmp $14e2          Drukuj nastpne znaki

; Drukuj skrcon nazw postaci (numer znajduje si w $0913). (0 = GIMBAL)

1540 lda $0913
1543 clc
1544 adc #$82
1546 jmp $14e2          Drukuj nastpne znaki

; Procedura drukujca znak o kodzie w akumulatorze od adresu ($cb)

1549 asl @              A * 8 - wynik umie w 156a,b
154a ldy #$00
154c sty $156b
154f asl @
1550 rol $156b
1553 asl @
1554 rol $156b
1557 clc
1558 adc #$00
155a sta $156a
155d lda $156b
1560 adc #$81
1562 sta $156b          $8100 - tablica znakw
1565 ldy #$00
1567 ldx #$00
1569 lda $ffff,x        We bajt do wydrukowania
156c jsr $0e15          Uwzgldnij aktualn palet kolorw
156f sta ($cb),y        Umie przetworzony bajt
1571 inx
1572 tya
1573 clc
1574 adc #$20           nastpna linia
1576 tay
1577 bne $1569
1579 jsr $0fa0          Oblicz adres nastpnej kratki na znak
157c rts

157d lda $d5            Zmniejsz o 1 $d5,6
157f sec
1580 sbc #$01
1582 sta $d5
1584 bcs $1588
1586 dec $d6
1588 rts

; Zwiksz o 1 $d5,6

1589 inc $d5
158b bne $158f
158d inc $d6
158f rts

; Zwiksz o $cb,c o 512

1590 inc $cc
1592 inc $cc
1594 lda #$00
1596 sta $cb
1598 rts

; Procedura drukuje na ekranie wycentrowan nazw lokacji w ktrej znajduje
; si Magic Knight

1599 lda #$64           wpisz do $d5,6 adres tablicy z nazwami lokacji
159b sta $d5            poprzedzonymi dugoci nazwy - $7a64
159d lda #$7a
159f sta $d6
15a1 lda $090d          we numer lokacji Magic Knighta
15a4 beq $15ad          jeeli jest to winda (pierwsza lokacja) -> $15ad
15a6 tax                numer lokacji do X
15a7 jsr $147f          przeskocz jeden PString o pocztku w d5,6
15aa dex                X -= -1
15ab bne $15a7          X <> 0 -> 15a7 (przeskocz nastpny PString)
15ad ldy #$00           pobierz pierwszy bajt znalezionego PStringu, ktrym
15af lda ($d5),y        jest dugo nazwy lokacji
15b1 bne $15b4          jeeli niezerowa -> $15b4
15b3 rts
15b4 clc                +8 (po cztery znaki dodatkowe z kadej strony napisu)
15b5 adc #$08
15b7 sec                -33 (32 jest liczb znakw mieszczcych si w linii)
15b8 sbc #$21
15ba eor #$ff           ten eor jest rwnowanikiem zmiany znaku i odjcia 1
15bc lsr @              /2 - otrzymujemy numer pozycji w linii liczc od 0
15bd and #$1f           na wszelki wypadek upewniamy si e bdzie to < 32
15bf sta $cb            bdzie to modszy bajt adresu w pamici ekranu
15c1 lda #$88           starszym bajtem bdzie $88
15c3 sta $cc            ($8800 - adres pocztku pamici ekranu)
15c5 jsr $1589          Zwiksz o 1 $d5,6 - na pocztek waciwego napisu
15c8 lda $d5            $d5 na stos
15ca pha
15cb lda $d6            $d6 na stos
15cd pha
15ce lda #$f2           ustawiamy $d5,6 na adres specjalnego tekstu do
15d0 sta $d5            wydrukowania przed waciwym napisem (adres: $15f2)
15d2 lda #$15
15d4 sta $d6
15d6 jsr $148f          skok w rodek procedury drukujcej na ekran pod $cb,c
15d9 pla                odczytaj poprzednie $d6 ze stosu
15da sta $d6
15dc pla                odczytaj poprzednie $d6 ze stosu
15dd sta $d5
15df lda #$64           Przetwrz palet ($64) na kody poszczeglnych kolorw
15e1 jsr $0dea
15e4 jsr $148f          teraz zasadnicze drukowanie tekstu - $d5,6 odtworzone
15e7 lda #$f2           ponownie ustawiamy $d5,6 na adres specjalnego tekstu
15e9 sta $d5            do wydrukowania (adres: $15f2)
15eb lda #$15
15ed sta $d6
15ef jmp $148f          skok w rodek procedury drukujcej na ekran pod $cb,c
15f2 dta $10,$a4			nowa paleta kolorw
     dta ' ** ',0

15f9 jsr $0dea          Przetwrz palet na kody poszczeglnych kolorw
15fc lda $0910          pozycja prawej krawdzi okienka
15ff sec
1600 sbc $090e          pozycja lewej krawdzi okienka
1603 sbc #$01
1605 sta $090c          szeroko okienka w kratkach - 2
1608 ldx $090e          pozycja lewej krawdzi okienka
160b ldy $090f          pozycja grnej krawdzi okienka
160e inx
160f jsr $1307          Oblicz adres w pamici obr. na podstawie przesunicia
1612 jsr $16af          rysuj grn krawd okienka
1615 inc $16b8          znak += 1
1618 ldx $090e          pozycja lewej krawdzi okienka
161b ldy $0911          pozycja dolnej krawdzi okienka
161e inx
161f jsr $1307          Oblicz adres w pamici obr. na podstawie przesunicia
1622 jsr $16af          rysuj doln krawd okienka
1625 inc $16b8          znak += 1
1628 lda $0911          pozycja dolnej krawdzi okienka
162b sec
162c sbc $090f          pozycja grnej krawdzi okienka
162f sbc #$01
1631 sta $090c          wysoko okienka w kratkach - 2
1634 ldx $090e          pozycja lewej krawdzi okienka
1637 lda $090f          pozycja grnej krawdzi okienka
163a clc
163b adc $090c          wysoko okienka w kratkach - 2
163e tay
163f jsr $1307          Oblicz adres w pamici obr. na podstawie przesunicia
1642 lda $16b8          znak, ktrym rysowane s lewe pionowe kreski
1645 jsr $1549          Drukuj znak w A od adresu ($cb)
1648 ldx $0910          pozycja prawej krawdzi okienka
164b lda $090f          pozycja grnej krawdzi okienka
164e clc
164f adc $090c          wysoko okienka w kratkach - 2
1652 tay
1653 jsr $1307          Oblicz adres w pamici obr. na podstawie przesunicia
1656 lda $16b8
1659 clc
165a adc #$01           znak, ktrym rysowane s prawe pionowe kreski
165c jsr $1549          Drukuj znak w A od adresu ($cb)
165f dec $090c          zmniejsz wysoko okienka o 1
1662 bne $1634          rysuj kreski pionowe w wierszu wyej
1664 ldx $0910          pozycja prawej krawdzi okienka
1667 ldy $090f          pozycja grnej krawdzi okienka
166a jsr $1307          Oblicz adres w pamici obr. na podstawie przesunicia
166d inc $16b8          znak += 2
1670 inc $16b8
1673 lda $16b8
1676 jsr $1549          Drukuj znak w A od adresu ($cb) (prawy grny rg)
1679 ldx $0910          pozycja prawej krawdzi okienka
167c ldy $0911          pozycja dolnej krawdzi okienka
167f jsr $1307          Oblicz adres w pamici obr. na podstawie przesunicia
1682 inc $16b8          znak += 1
1685 lda $16b8
1688 jsr $1549          Drukuj znak w A od adresu ($cb) (prawy dolny rg)
168b ldx $090e          pozycja lewej krawdzi okienka
168e ldy $0911          pozycja dolnej krawdzi okienka
1691 jsr $1307          Oblicz adres w pamici obr. na podstawie przesunicia
1694 inc $16b8          znak += 1
1697 lda $16b8
169a jsr $1549          Drukuj znak w A od adresu ($cb) (lewy dolny rg)
169d ldx $090e          pozycja lewej krawdzi okienka
16a0 ldy $090f          pozycja grnej krawdzi okienka
16a3 jsr $1307          Oblicz adres w pamici obr. na podstawie przesunicia
16a6 inc $16b8          znak += 1
16a9 lda $16b8
16ac jmp $1549          Drukuj znak w A od adresu ($cb) (lewy grny rg)

; Procedura rysuje jeden pusty wiersz okienka ([$090c] - liczba spacji
; w wierszu)

16af ldx $090c
16b2 bne $16b5
16b4 rts
16b5 txa
16b6 pha
16b7 lda #$00           operand 'lda' jest ustawiany przed wywoaniem proc.
16b9 jsr $1549          Drukuj ten znak od adresu ($cb)
16bc pla
16bd tax
16be dex
16bf jmp $16b2

; Procedura rysuje na ekranie okienko o kodzie $a, ktre ma otacza bitmap
; o numerze podanym w $090b.

16c2 lda #$0a           numer okienka do narysowania na stos
16c4 pha                (bdzie wykorzystany przez procedur $172d)
16c5 lda $090b          we numer bitmapy, ktra ma by wywietlona
16c8 sta $cf            zapisz jako modszy bajt offsetu w tablicy $4dab
16ca lda #$00           starszym bajtem offsetu bdzie na razie 0
16cc sta $d0
16ce asl $cf            pomn offset przez 2
16d0 rol $d0
16d2 asl $cf            i jeszcze przez 2 (elementy w tablicy $4dab s
16d4 rol $d0                               czterobajtowe)
16d6 lda $cf            [$cf,d0] += $4dab (pocztek tablicy danych bitmap
16d8 clc                                   przypisanych bitmapom)
16d9 adc #$ab
16db sta $cf
16dd lda $d0
16df adc #$4d
16e1 sta $d0
16e3 lda #$03           standardowa wysoko bitmapy - 3 kratki
16e5 sta $0906
16e8 ldy #$00           we pierwszy bajt elementu z tablicy
16ea lda ($cf),y
16ec cmp #$ff           jeeli rwny $ff -> $16fd (zdefiniowano inn wysoko)
16ee beq $16fd
16f0 jsr $108a          Zwiksz o 1 $cf,d0
16f3 ldy #$00           we drugi bajt z tablicy (wysoko bitmapy w kratkach)
16f5 lda ($cf),y
16f7 clc                +1 (za chwil pobierzemy warto z tej komrki)
16f8 adc #$01
16fa sta $0906          jest to wysoko bitmapy
16fd lda #$70           okienko, ktre pod koniec procedury zostanie
16ff sta $179d          narysowane ma nie mie strzaki ([$179d] <> $69)
1702 lda $0908          we ustawion wczeniej wsp. X lewej krawdzi okienka
1705 sta $4afb          zapisz A jako pozycj lewej krawdzi okienka nr $a
1708 clc                A += 3
1709 adc #$03
170b sta $4afc          zapisz A jako pozycj prawej krawdzi okienka nr $a
170e lda $090a          we ustawion wczeniej wsp. Y grnej krawdzi okienka
1711 sta $4afd          zapisz A jako pozycj grnej krawdzi okienka nr $a
1714 clc                dodaj wysoko bitmapy + 1
1715 adc $0906
1718 sta $4afe          zapisz A jako pozycj dolnej krawdzi okienka nr $a
171b jmp $172d          skok do rodka procedury rysujcej okienko

; Narysuj okienko ze strzak o numerze zapisanym w A

171e pha                numer okienka na stos
171f lda #$69           znacznik, e okienko ma mie strzak
1721 sta $179d          zapisz jako argument lda w procedurze poniej
1724 jmp $172d          skok do procedury rysujcej

; Procedura rysuje okienko bez strzaki (A - numer okienka)

1727 pha                numer okienka na stos
1728 lda #$6f           zaznacz, e okienko ma nie mie strzaki (w $179d
172a sta $179d          jest warto rna od $69)
172d pla                we ze stosu numer okienka
172e sta $2136          [$2136] - rodzaj okienka
1731 asl @
1732 asl @
1733 ldx #$00
1735 stx $d8
1737 asl @
1738 rol $d8            A * 8, najstarszy bit do $d8
173a clc
173b adc #$ab
173d sta $d7
173f lda $d8
1741 adc #$4a
1743 sta $d8            tablica okienek zaczyna si od $4aab

1745 ldy #$00           Y=0
1747 lda ($d7),y
1749 sta $090e          pozycja lewej krawdzi okienka
174c iny                Y=1
174d lda ($d7),y
174f sta $0910          pozycja prawej krawdzi okienka
1752 iny                Y=2
1753 lda ($d7),y
1755 sta $090f          pozycja grnej krawdzi okienka
1758 iny                Y=3
1759 lda ($d7),y
175b sta $0911          pozycja dolnej krawdzi okienka
175e iny                Y=4
175f lda ($d7),y        kod ASCII pierwszego ze znakw, z ktrych budowana
1761 sta $16b8          jest sama ramka
1764 iny                Y=5
1765 lda ($d7),y        paleta kolorw dla samej ramki
1767 pha
1768 iny                Y=6
1769 lda ($d7),y        numer wiersza (liczony od 0) od ktrego moe porusza
176b sta $0914          si strzaka
176e iny                Y=7
176f lda ($d7),y
1771 sta $0937				paleta kolorw dla wntrza okienka
1774 pla                A = paleta kolorw dla samej ramki
1775 jsr $15f9          narysuj sam ramk
1778 inc $090e          pozycja lewej krawdzi okienka++    (komrki te bd
177b inc $090f          pozycja grnej krawdzi okienka++   teraz zawieray
177e dec $0910          pozycja prawej krawdzi okienka--   dane samego
1781 dec $0911          pozycja dolnej krawdzi okienka--   wntrza okienka)
1784 lda $0937
1787 jsr $0dea          Przetwrz palet na kody poszczeglnych kolorw
178a jsr $17e4          Wyczy cay obszar okienka
178d ldx $090e          modszy bajt przesunicia
1790 ldy $090f          starszy bajt przesunicia
1793 jsr $1307          Oblicz adres w pamici obr. na podstawie przesunicia
1796 lda $cb
1798 pha
1799 lda $cc
179b pha
179c lda #$00           operand 'lda' jest ustawiany
179e cmp #$69           czy okienko ma strzak
17a0 bne $17bb
17a2 ldx $090e          pozycja lewej krawdzi okienka
17a5 inx
17a6 lda $0914          numer wiersza od ktrego moe porusza si strzaka
17a9 clc
17aa adc $090f          pozycja grnej krawdzi okienka
17ad tay
17ae jsr $1307          Oblicz adres w pamici obr. na podstawie przesunicia
17b1 ldx #$00
17b3 jsr $17c7          Narysuj grn poow strzaki
17b6 inc $cc				po wyjciu z powyszej procedury X=16
17b8 jsr $17c7          Narysuj doln poow strzaki
17bb lda #$00           ustaw pocztkowe przesunicie strzaki
17bd sta $0912
17c0 pla
17c1 sta $cc
17c3 pla
17c4 sta $cb
17c6 rts

; Narysuj grn (gdy X = 0) lub doln (gdy X = 16) poow strzaki.
; Kada poowa jest bitmap 8x8 pikseli, ktrych definicja zapisana
; jest od adresu $bcf0.

17c7 ldy #$00
17c9 lda $bcf0,x
17cc jsr $0e15          Uwzgldnij aktualn palet kolorw
17cf sta ($cb),y
17d1 iny
17d2 inx
17d3 lda $bcf0,x
17d6 jsr $0e15          Uwzgldnij aktualn palet kolorw
17d9 sta ($cb),y
17db inx
17dc tya
17dd clc
17de adc #$1f
17e0 tay
17e1 bcc $17c9
17e3 rts

; Wyczy obszar okienka (X, Y - modszy i starszy bajt adresu lewej grnej
; kratki)

17e4 ldx $090e          pozycja lewej krawdzi okienka
17e7 ldy $090f          pozycja grnej krawdzi okienka
17ea jsr $1307          Oblicz adres w pamici obr. na podstawie przesunicia
17ed lda $0910          pozycja prawej krawdzi okienka
17f0 sec
17f1 sbc $090e          pozycja lewej krawdzi okienka
17f4 tax
17f5 lda $0911          pozycja dolnej krawdzi okienka
17f8 sec
17f9 sbc $090f          pozycja grnej krawdzi okienka
17fc tay
17fd iny
17fe inx
17ff stx $090c          tymczasowa komrka przechowujca liczb pozostaych
1802 ldx $090c          do przetworzenia kratek w wierszu
1805 tya
1806 pha
1807 lda $cb
1809 pha
180a ldy #$00
180c lda #$00           Wypenij 1 kratk
180e jsr $0e15          Uwzgldnij aktualn palet kolorw
1811 sta ($cb),y
1813 tya
1814 clc
1815 adc #$20
1817 tay
1818 bne $180c
181a jsr $0fa0          Oblicz adres nastpnej kratki na znak
181d dex
181e bne $180a          do koca rzdu
1820 pla
1821 sta $cb
1823 inc $cc
1825 pla
1826 tay
1827 dey
1828 bne $1802          do koca kolumny
182a rts

; Procedura wpisuje do d3,4 adres tablicy rozmieszczenia postaci i inicjuje
; komrk $0917 liczb postaci wystpujcych w danej chwili w grze (poza MK) i
; komrk $0918 zerem - numerem postaci, ktr bdziemy za chwil przetwarza

182b lda #$7a           [$d3,4] = $047a (adres tablicy rozmieszczenia postaci)
182d sta $d3
182f lda #$04
1831 sta $d4
1833 ldx #$00           zainicjuj na 0 nr postaci, ktr bdziemy przetwarza
1835 ldy #$07           zainicjuj na 7 liczb postaci w danej chwili gry
1837 lda $0915          sprawd, czy MK upuci ju GLOWING BOTTLE
183a and #$01           (czy jest BANSHEE)
183c beq $183f          nie -> $183f (przeskocz nastpn instrukcj)
183e iny                zwiksz o 1 liczb postaci
183f stx $0917          zapisz w komrce docelowej nr postaci przetwarzanej
1842 sty $0918          zapisz liczb postaci z danej chwili do kom. docelowej
1845 rts

; Procedura wywietla wszystkie postaci znajdujce si w lokacji Magic
; Knighta. Operacja ta przebiega w dwch fazach: najpierw wywietlane s
; postaci nieruchome, nastpnie animowane s wszystnie postaci, ktre maj
; si pojawi "w dymku".

1846 jsr $182b          wpisz do d3,4 adres tab. rozm. post., zainicj. $0917,8
1849 lda #$40           Element wpisywany do tablicy kolizji bdzie oznacza,
184b sta $092d          e narysowany obiekt jest przezroczysty dla MK
184e lda #$e4
1850 jsr $0dea          Przetwrz palet ($e4) na kody poszczeglnych kolorw
1853 lda $090d          we numer lokacji Magic Knighta
1856 ldy #$00           porwnaj go z nr lokacji zajmowanej przez dan posta
1858 cmp ($d3),y
185a bne $1872          jeli rne -> $1872 (kontyn. ptli dla nast. postaci)
185c lda $0917          we numer postaci, ktra jest przetwarzana
185f bne $1864          jeeli to nie GIMBALL -> $1864 (standardowa paleta)
1861 lda #$e4           we palet, ktra moe by zmieniona po "THROW"
1863 bit $e4a9          jest to 'lda #$e4' od $1864 (standardowa paleta)
1866 jsr $0dea          Przetwrz palet na kody poszczeglnych kolorw
1869 lda $0917          we numer postaci, ktra jest przetwarzana
186c clc                +$45
186d adc #$45
186f jsr $18b5          rysuj posta jako bitmap o numerze podanym w A
1872 inc $0917          zwiksz numer postaci, ktra jest przetwarzana
1875 jsr $12c0          Zwiksz o 1 $d3,4
1878 jsr $12c0          Zwiksz o 1 $d3,4
187b jsr $12c0          Zwiksz o 1 $d3,4
187e dec $0918          zmniejsz ustawion przez proc. $182b liczb postaci
1881 bne $1853          jeeli <> 0 -> $1853 (przetwarzanie kolejnych postaci)

; Procedura przeglda list postaci i animuje ich "pojawienie si w dymku",
; jeeli tak zostao zapisane w ich atrybutach.

1883 jsr $182b          wpisz do d3,4 adres tab. rozm. post., zainicj. $0917,8
1886 lda #$e4           Przetwrz palet ($e4) na kody poszczeglnych kolorw
1888 jsr $0dea
188b ldy #$00           we nr lokacji zajmowanej przez kolejn posta
188d lda ($d3),y
188f bpl $18a3          jeeli posta jest w dymku -> $18a3 (nastpna posta)
1891 and #$7f           pomi najstarszy bit
1893 cmp $090d          czy posta znajduje si w lokacji Magic Knighta?
1896 bne $18a3          nie -> $18a3 (nastpna posta)
1898 sta ($d3),y        zapisz A jako nr lokacji postaci (bez dymka)
189a lda $0917          we numer postaci, ktra jest przetwarzana
189d clc                +$45
189e adc #$45
18a0 jsr $18c7          animuj pojawianie si postaci
18a3 inc $0917          zwiksz numer postaci, ktra jest przetwarzana
18a6 jsr $12c0          Zwiksz o 1 $d3,4
18a9 jsr $12c0          Zwiksz o 1 $d3,4
18ac jsr $12c0          Zwiksz o 1 $d3,4
18af dec $0918          zmniejsz o 1 liczb postaci do przetworzenia
18b2 bne $188b          jeeli zostao > 0 -> $188b (przetw. kolejnej postaci)
18b4 rts

; Procedura rysuje posta w przypisanym jej miejscu jako bitmap o numerze
; podanym w A. d3,4 musi zawiera adres pocztku atrybutw tej postaci.

18b5 pha                zapisz nr bitmapy na stos
18b6 ldy #$01           we kratkow pozycj X postaci
18b8 lda ($d3),y
18ba sta $0907          zapisz j do komrki zawierajcej szeroko bitmapy
18bd iny                we kratkow pozycj Y postaci
18be lda ($d3),y
18c0 sta $0909          zapisz j do komrki zawierajcej wysoko bitmapy
18c3 pla                odtwrz nr bitmapy ze stosu
18c4 jmp $0fb5          wywietl du bitmap eorujc jej piks. z piks. ta

; Procedura animuje pojawianie si postaci. W A powinien by podany numer
; bitmapy docelowej, w komrkach $0907 i $0909 powinna by wpisana jej
; szeroko i wysoko.

18c7 pha                we nr bitmapy docelowej przypisanej postaci
18c8 lda #$3f           we nr pierwszej bitmapy - dymka
18ca pha                i w go na stos
18cb jsr $18b5          rysuj posta jako bitmap o numerze podanym w A
18ce jsr $2249          odczekaj 1/5 sekundy
18d1 pla                nie zmieniajc stosu pobierz z niego nr aktualn. bitm.
18d2 pha
18d3 jsr $18b5          rysuj posta jako bitmap o numerze podanym w A
18d6 pla                pobierz ze stosu nr aktualnej bitmapy
18d7 clc                +1
18d8 adc #$01
18da cmp #$45           czy doszlimy do $45 (ostatniej bitmapy - dymka)?
18dc bne $18ca          nie -> $18ca (kontunuacja animacji)
18de pla                we nr bitmapy docelowej przypisanej postaci
18df jmp $18b5          rysuj posta jako bitmap o numerze podanym w A

; Procedura generujca opnienie. X - liczba obiegw zewntrznej ptli

18e2 ldy #$ff
18e4 dey
18e5 bne $18e4
18e7 dex
18e8 bne $18e4
18ea rts

; Czy Magic Knight ma przedmiot o kodzie w A? Z = 1 -> ma, Z = 0 -> nie ma.

18eb pha
18ec jsr $31c9          Ustaw $e1,2 na adres stanu posiadania Magic Knighta
18ef pla
18f0 ldy #$04
18f2 cmp ($e1),y
18f4 bne $18f7
18f6 rts
18f7 dey
18f8 bpl $18f2
18fa rts

; Rysuj pasek energii (jeli Magic Knight ma Mirror)

18fb lda #$23           Czy Magic Knight ma Mirror?
18fd jsr $18eb
1900 beq $1903          ma
1902 rts
1903 ldy #$00
1905 lda $03fd          we si Magic Knighta
1908 lsr @
1909 lsr @
190a lsr @
190b and #$0f           A - liczba "caych kwadracikw energii" do narysowania
190d beq $1920          jeli = 0 -> nic nie rb
190f tax
1910 lda #$ff           4 piksele si wiec (na biao) w linii
1912 sta $9d02,y
1915 tya
1916 clc
1917 adc #$40           co druga linia
1919 tay
191a bcc $1910          ptla wykona si 4 razy
191c iny                nastpna kolumna pikseli
191d dex
191e bne $1910          powtrz tyle razy, ile miao by kwadracikw
1920 lda $03fd          we si Magic Knighta
1923 and #$07           A -> dolny nibble energii
1925 bne $192b
1927 lda #$00
1929 beq $1933          jeli jest zerem, to trzeba narysowa pusty kwadracik
192b tax                jeli nie,
192c lda #$00
192e sec
192f ror @              to w A ustaw tyle bitw od lewej strony
1930 dex                ile wynosi ten nibble
1931 bne $192e
1933 sta $9d02,y        wstaw A do pamici ekranu
1936 pha
1937 tya
1938 clc
1939 adc #$40           co druga linia
193b tay
193c pla
193d bcc $1933          ptla wykona si 4 razy
193f rts

; Narysuj niesione przedmioty, jeeli MK niesie Mirror

1940 lda #$23           Czy Magic Knight ma Mirror?
1942 jsr $18eb
1945 beq $1948          ma -> $1948 (rysowanie niesionych przedmiotw)
1947 rts
1948 lda #$00           Element wpisywany do tablicy kolizji bdzie oznacza,
194a sta $092d          e narysowany obiekt jest przezroczysty dla MK
194d lda #$15           zapamitaj, e bitmapa przedmiotu ma si pojawi na
194f sta $0909          ekranie od offsetu $1510
1952 lda #$10
1954 sta $0907
1957 ldx #$00           Zacznij od pierwszego przedmiotu
1959 lda $044d,x        We numer kolejnego przedmiotu, ktry niesie Knight
195c beq $1981          jeli jednak go nie ma -> rts
195e jsr $1982          Zwr w $d9,a adres opisu przedmiotu o numerze w A
1961 txa                Numer przedmiotu na stos
1962 pha
1963 ldy #$06           We palet kolorw
1965 lda ($d9),y
1967 jsr $0dea          Przetwrz palet na kody poszczeglnych kolorw
196a ldy #$07
196c lda ($d9),y        We numer bitmapy tego przedmiotu,
196e jsr $0fc5          narysuj go
1971 lda $0907          Ustal adres na nastpny przedmiot
1974 clc
1975 adc #$03
1977 sta $0907
197a pla                Odtwrz numer przedmiotu Magic Knighta
197b tax
197c inx                i zwiksz go
197d cpx #$05           Jeli to nie ostatni (moliwy) przedmiot,
197f bne $1959          powtrz operacj dla kolejnego
1981 rts

; Zwr w $d9,a adres pocztku opisu przedmiotu o numerze w A

1982 asl @
1983 asl @
1984 ldy #$00
1986 sty $da
1988 asl @              8 bajtw na przedmiot
1989 rol $da
198b clc
198c adc #$1b           $4c1b + 8 = pocztek tablicy
198e sta $d9
1990 lda $da
1992 adc #$4c
1994 sta $da
1996 rts

; Narysuj przedmioty znajdujce si w lokacji MK

1997 lda #$92           ustaw $d3,4 na adres tablicy rozmieszcz. przedmiotw
1999 sta $d3            ($0492)
199b lda #$04
199d sta $d4
199f ldx #$00           zainicjuj numer przedmiotu przegldanego na 0
19a1 ldy #$00           zainicjuj indeks do przegldanej tablicy (niezmienny)
19a3 lda ($d3),y        we numer lokacji, w ktrej znajduje si przedmiot
19a5 cmp $090d          czy jest to lokacja Magic Knighta?
19a8 bne $19ad          nie -> $19ad (przeskocz nastpn instrukcj)
19aa jsr $19bc          Narysuj przedmiot o numerze podanym w A
19ad jsr $12c0          Zwiksz o 1 $d3,4
19b0 jsr $12c0          Zwiksz o 1 $d3,4    (do danych nastpnego przedmiotu)
19b3 jsr $12c0          Zwiksz o 1 $d3,4
19b6 inx                zwiksz o 1 numer przedmiotu przegldanego
19b7 cpx #$32           czy doszlimy do $32 (jest $32 przedmiotw)?
19b9 bne $19a1          nie -> $19a1 (kontunuacja ptli)
19bb rts

; Procedura rysuje przedmiot o numerze podanym w A uaktualniajc tablic
; kolizji

19bc txa                przelij do A nr przedm., ktry znaleziono w lok. MK
19bd pha                wstaw go na stos
19be jsr $1982          Zwr w $d9,a adres opisu przedmiotu o numerze w A
19c1 ldy #$06           we palet uywan przy wywietlaniu tego przedmiotu
19c3 lda ($d9),y
19c5 jsr $0dea          Przetwrz palet na kody poszczeglnych kolorw
19c8 ldy #$07           we nr bitmapy przypisanej przedmiotowi
19ca lda ($d9),y
19cc pha                wstaw ten numer na stos
19cd ldy #$01           we pozycj X (kratkow) przedmiotu
19cf lda ($d3),y
19d1 sta $0907          bdzie to modszy bajt offsetu wzg. pocz. pam. obrazu
19d4 iny                we pozycj Y (kratkow) przedmiotu
19d5 lda ($d3),y
19d7 sec                od pozycji Y przedmiotu odejmuje si 1, gdy liczone
19d8 sbc #$01           s one od 1 a nie od 0
19da sta $0909
19dd lda #$00           Element wpisywany do tablicy kolizji bdzie oznacza,
19df sta $092d          e narysowany obiekt jest przezroczysty dla MK
19e2 pla                we nr bitmapy przypisanej przedmiotowi ze stosu
19e3 jsr $0fbd          wywietl du bitmap OR-ujc jej piks. z piks. ta
19e6 ldx $0907          We do X i Y modszy i starszy bajt offsetu, ktre
19e9 ldy $0909          s te wsprzdn X i Y
19ec jsr $2628          Oblicz w e3,4 adres elem. z tabl. kolizji dla pozycji
19ef pla                niezmieniajc stosu odczytaj z niego nr przedmiotu
19f0 pha
19f1 jsr $1982          Zwr w $d9,a adres opisu przedmiotu o numerze w A
19f4 ldy #$07           we nr bitmapy przypisanej przedmiotowi
19f6 lda ($d9),y
19f8 asl @              *2
19f9 ldy #$00           wpisz 0 do starszego bajtu adresu, ktry zostanie utw.
19fb sty $d0
19fd asl @              A = nr_bitmapy * 4
19fe rol $d0            zap ewentualny bit przenies. w starszym bajcie adresu
1a00 clc                dodaj do A warto $4dab i zapisz j w $cf,d0 -
1a01 adc #$ab           postanie adres czterobajtowego elementu tablicy
1a03 sta $cf            opisujcego bitmapy
1a05 lda $d0
1a07 adc #$4d
1a09 sta $d0
1a0b ldy #$01           pobierzemy z tablicy bajt pod indeksem 1, zawierajcy
1a0d lda ($cf),y        bity ustawiane w tablicy kolizji
1a0f pha                zachowaj bajt na stosie
1a10 and #$c0           wyodrbnij bity 7 i 6
1a12 ldy #$00           indeks w tabl. kolizji dla lewej-grnej kratki przedm.
1a14 ora ($e3),y        wykonaj 'ora' z elemenem tablicy kolizji
1a16 sta ($e3),y
1a18 iny                zwiksz Y na 1 (indeks do prawej-grnej kratki)
1a19 pla                odczytaj i zapisz z powrotem na stosie bajt kolizji
1a1a pha
1a1b rol @              * 2
1a1c rol @
1a1d and #$c0           wyodrbnij bity 5 i 4 (na pozycjach bitw 7 i 6)
1a1f ora ($e3),y        wykonaj 'ora' z elemenem tablicy kolizji
1a21 sta ($e3),y
1a23 ldy #$20           indeks w tabl. kolizji do lewej-dolnej kratki przedm.
1a25 pla                odczytaj i zapisz z powrotem na stosie bajt kolizji
1a26 pha
1a27 rol @              * 32
1a28 rol @
1a29 rol @
1a2a rol @
1a2b and #$c0           wyodrbnij bity 3 i 2 (na pozycjach bitw 7 i 6)
1a2d ora ($e3),y        wykonaj 'ora' z elemenem tablicy kolizji
1a2f sta ($e3),y
1a31 iny                indeks w tabl. kolizji do prawej-dolnej kratki przedm.
1a32 pla                odczytaj ze stosu bajt kolizji
1a33 ror @              / 8 - ale dwa najmodsze bity trafi znowu do bajtu
1a34 ror @                    jako bity najstarsze
1a35 ror @
1a36 and #$c0           wyodrbnij bity 1 i 0 (na pozycjach bitw 7 i 6)
1a38 ora ($e3),y        wykonaj 'ora' z elemenem tablicy kolizji
1a3a sta ($e3),y
1a3c pla                we ze stosu nr przedmiotu przetwarzanego
1a3d tax                przelij go do X, tak jak byo na pocztku
1a3e rts

; Wywietl dwa okienka pojawiajce si przy starcie gry

1a3f jsr $0dd1          Wyczy ekran
1a42 lda #$05           Rysuj okienko nr. 5
1a44 jsr $1727
1a47 lda #$47
1a49 sta $d5
1a4b lda #$4f
1a4d sta $d6            drukuj tekst zapisany od adresu $4f47
1a4f jsr $148f          "SPELLBOUND A TRUE GRAPHICS ADVENTURE..."
1a52 lda #$06           Rysuj okienko nr. 6
1a54 jsr $171e
1a57 lda #$c5
1a59 sta $d5
1a5b lda #$5d
1a5d sta $d6            drukuj tekst zapisany od adresu $5dc5
1a5f jsr $148f          "INSTRUCTIONS  PLAY GAME"
1a62 rts

; Przescrolluj pasek o szerokoci 2 kratek do gry o jeden wiersz ekranowy.
; [$0919], [$091a] - adres pierwszego bajtu, [$91b] - liczba wierszy do
; scrollowania

1a63 lda $0919          $db,c - adres pierwszego bajtu
1a66 sta $db
1a68 lda $091a
1a6b sta $dc
1a6d ldx $091b          X = liczba linii do scrollowania
1a70 ldy #$20           we pierwszy bajt linii poniszej
1a72 lda ($db),y
1a74 pha
1a75 iny
1a76 lda ($db),y        we drugi bajt linii poniszej
1a78 pha
1a79 tya                Y -= $20
1a7a sec
1a7b sbc #$20
1a7d tay
1a7e pla                wstaw bajty zapisane na stosie do linii wyej
1a7f sta ($db),y        pierwszy
1a81 pla
1a82 dey
1a83 sta ($db),y        i drugi
1a85 lda $db            [$db] += $20
1a87 clc
1a88 adc #$20
1a8a sta $db
1a8c bcc $1a90
1a8e inc $dc
1a90 dex                kolejna linia
1a91 bne $1a70
1a93 ldy #$00           w linii na samym dole umie 2 bajty zerowe
1a95 tya
1a96 jsr $0e15          Uwzgldnij aktualn palet kolorw
1a99 sta ($db),y
1a9b iny
1a9c sta ($db),y
1a9e rts

; Przescrolluj pasek o szerokoci 2 kratek do dou o jeden wiersz ekranowy.
; [$0919], [$091a] - adres pierwszego bajtu, [$091b] - liczba wierszy do
; scrollowania

1a9f lda $091b          [$db,c] - liczba wierszy do scrolowania - 1
1aa2 sec
1aa3 sbc #$01
1aa5 sta $db
1aa7 lda #$00
1aa9 sta $dc
1aab ldx #$05           [$db,c] *= 32
1aad asl $db
1aaf rol $dc
1ab1 dex
1ab2 bne $1aad
1ab4 lda $0919          [$db,c] += adres pierwszego bajtu pierwszej linii
1ab7 clc                ([$db,c] = adres pierwszego bajtu ostatniej linii)
1ab8 adc $db
1aba sta $db
1abc lda $dc
1abe adc $091a
1ac1 sta $dc
1ac3 ldx $091b          X = liczba linii do scrollowania
1ac6 ldy #$00           we pierwszy bajt linii biecej
1ac8 lda ($db),y
1aca pha                na stos
1acb iny
1acc lda ($db),y        we drugi bajt linii biecej
1ace pha                na stos
1acf tya
1ad0 clc
1ad1 adc #$20
1ad3 tay
1ad4 pla                wstaw te bajty do linii poniszej
1ad5 sta ($db),y
1ad7 pla
1ad8 dey
1ad9 sta ($db),y
1adb lda $db            przenie si do linii bezporednio wyej
1add sec
1ade sbc #$20
1ae0 sta $db
1ae2 bcs $1ae6
1ae4 dec $dc
1ae6 dex                kolejna linia
1ae7 bne $1ac6
1ae9 lda #$00           wstaw do pierwszej linii dwa bajty zerowe
1aeb ldy #$20
1aed jsr $0e15          Uwzgldnij aktualn palet kolorw
1af0 sta ($db),y
1af2 iny
1af3 sta ($db),y
1af5 rts

; Obsu wybr joystickiem pozycji w okienku. W A zwr identyfikator wybranej
; pozycji

1af6 lda $179d          czy okienko ma strzak?
1af9 cmp #$69
1afb beq $1afe          tak -> $1afe (obsuguj joystick)
1afd rts                Zwr to co jest w komrce $179d jako identyfikator

1afe lda $0937          we palet kolorw samej ramki
1b01 jsr $0dea          Przetwrz palet na kody poszczeglnych kolorw
1b04 ldx $090e          pozycja lewej krawdzi okienka
1b07 inx                +1
1b08 stx $0919          [$0919] - numer pierwszej kolumny dla strzaki
1b0b lda $0914          numer wiersza od ktrego moe porusza si strzaka
1b0e clc
1b0f adc $090f          pozycja grnej krawdzi okienka
1b12 clc                oblicz bezwzgldny adres tej kratki ekranu
1b13 adc #$88
1b15 sta $091a          [$091a] - starszy bajt pierwszego bajtu strzaki
1b18 lda $0911          pozycja dolnej krawdzi okienka
1b1b sec                odejmij numer wiersza od ktrego moe porusza si
1b1c sbc $0914          strzaka
1b1f sbc $090f          odejmij pozycj grnej krawdzi okienka
1b22 clc
1b23 adc #$01           + 1 (wynik: liczba wierszy dla strzaki + 1)
1b25 asl @              *8
1b26 asl @
1b27 asl @
1b28 sec                -1
1b29 sbc #$01
1b2b sta $091b          [$091b] = liczba linii dla strzaki + 7
1b2e jsr $1bb6          EOR #$FF na kratce, nad ktr jest strzaka
1b31 ldx #$10           Wykonaj procedur opniajc z parametrem $10
1b33 jsr $18e2
1b36 jsr $1be5          Odczytaj stan joystickw. Wynik w $091c i w A.
1b39 lsr @              wskanik wychylenia w gr do C
1b3a bcc $1b46          gdy wychylono -> $1b46 (przemieszcz. strzaki w gr)
1b3c lsr @              wskanik wychylenia w d do C
1b3d bcc $1b6f          gdy wychylono -> $1b6f (przemieszcz. strzaki w d)
1b3f and #$04           sprawd, czy jest nacinity FIRE (teraz to bit nr 2)
1b41 beq $1ba3          tak -> $1ba3 (wybrano pozycj)
1b43 jmp $1b31          skok na pocztek fragmentu odczytujcego joysticki

; Fragment obsugujcy przemieszczenie strzaki w gr

1b46 lda $0912          we aktualne przesunicie strzaki
1b49 beq $1b6c          gdy 0 (strzaka u gry) -> $1b6c (na koniec ptli)
1b4b pha                zapisz star warto przesunicia na stos
1b4c sec                -2
1b4d sbc #$02
1b4f sta $0912          bdzie to nowa warto przesunicia strzaki
1b52 jsr $1a63          Przescrolluj pasek 2-bajtowy o jedn lini do gry
1b55 jsr $1a63          Przescrolluj pasek 2-bajtowy o jedn lini do gry
1b58 pla                nie zmieniajc stosu odczytaj z niego star warto
1b59 pha                przesunicia strzaki
1b5a clc                dodaj do tego $0d (offset od pocztku bitmapy do
1b5b adc #$0d                              ostrza strzaki)
1b5d and #$07           we 3 najm. bity (stare przesunicie w ramach kratki)
1b5f cmp #$01           jeeli nie byo 1 (co po zmniejszeniu o 2 da przejcie
1b61 bne $1b6b          do poprzedniej kratki) -> $1b6b (zrb 'pla' i wyjd)
1b63 pla                we poprzedni warto przesunicia strzaki ze stosu
1b64 jsr $1bb9          wytrzyj dotychczas podwietlon kratk
1b67 jsr $1bb6          EOR #$FF na kratce, nad ktr jest strzaka
1b6a bit $68            argumentem tej instrukcji jest kod 'pla'
1b6c jmp $1b31          skok na pocztek fragmentu odczytujcego joysticki

; Fragment obsugujcy przemieszczenie strzaki w d

1b6f lda $091b          jeeli liczba linii dla pozycji + 7 jest < 15
1b72 sec                (czyli w menu jest tylko 1 pozycja) -> $1ba0 (wyjd)
1b73 sbc #$10
1b75 bmi $1ba0          w A zostaje liczba linii pozycji w menu - 9
1b77 cmp $0912          jeeli jest ona mniejsza od aktualnego przesunicia
1b7a bcc $1ba0          strzaki -> $1ba0 (nie wolno przesuwa bardziej w d)
1b7c lda $0912          We przesunicie strzaki
1b7f pha                na stos
1b80 clc
1b81 adc #$02           +2
1b83 sta $0912          bdzie to nowe przesunicie strzaki
1b86 jsr $1a9f          Przescrolluj pasek 2-bajtowy o jedn lini do dou
1b89 jsr $1a9f          Przescrolluj pasek 2-bajtowy o jedn lini do dou
1b8c pla                we stare przesunicie strzaki
1b8d pha
1b8e clc
1b8f adc #$0d           dodaj offset pomidzy pocz. bitmapy a ostrzem strzaki
1b91 and #$07           we 3 najm. bity (stare przesunicie w ramach kratki)
1b93 cmp #$07           jeeli nie byo 7 (co po zwikszeniu o 2 da przejcie
1b95 bne $1b9f          do nastpnej kratki) -> $1b9f (zrb 'pla' i wyjd)
1b97 pla                we poprzedni warto przesunicia strzaki ze stosu
1b98 jsr $1bb9          wytrzyj dotychczas podwietlon kratk
1b9b jsr $1bb6          EOR #$FF na kratce, nad ktr jest strzaka
1b9e bit $68            argumentem tej instrukcji jest kod 'pla'
1ba0 jmp $1b31          skok na pocztek fragmentu odczytujcego joysticki

; Fragment obsugujcy nacinicie FIRE

1ba3 jsr $1cdc          Czekaj na zwolnienie przycisku joysticka
1ba6 jsr $1bb6          EOR #$FF na kratce, nad ktr jest strzaka
1ba9 lda $091d          przepisz adres kratki z liter do $cb,c, skd pobierze
1bac sta $cb            go procedura rozpoznajca
1bae lda $091e
1bb1 sta $cc
1bb3 jmp $1c55          Rozpoznaj liter w kratce o adr. $cb,c. Wynik w A.

; Wykonaj operacj EOR #$FF na powierzchni kratki, nad ktr znajduje si
; strzaka. Adres tej kratki zapisywany jest ponadto do $091d,e

1bb6 lda $0912          We przesunicie strzaki wzgldem grnej krawdzi
1bb9 clc                kratki
1bba adc #$0d           +$0d (jest to przesunicie pomidzy grn krawdzi
1bbc lsr @                    bitmapy a ostrzem strzaki)
1bbd lsr @
1bbe lsr @              /8 (jeli wyjdzie 1, to podwietl nastpn kratk)
1bbf clc
1bc0 adc $0914          numer wiersza od ktrego moe porusza si strzaka
1bc3 adc $090f          pozycja grnej krawdzi okienka
1bc6 adc #$88           starszy bajt pocztlu pamici obrazu
1bc8 sta $dc            zapisz bardziej znaczcy bajt
1bca sta $091e          backup tego bajtu
1bcd lda $090e          pozycja lewej krawdzi okienka
1bd0 sta $db            zapisz mniej znaczcy bajt
1bd2 sta $091d          backup tego bajtu
1bd5 ldy #$00           Przeprowad operacj EOR #$FF na caej powierzchni
1bd7 lda ($db),y        kratki
1bd9 eor #$ff
1bdb sta ($db),y
1bdd tya
1bde clc
1bdf adc #$20
1be1 tay
1be2 bcc $1bd7
1be4 rts

; Procedura odczytuje stan joystickw, wynik: 5 najmodszych bitw w $091c.

1be5 lda porta
1be8 and #$0f
1bea cmp #$0f
1bec bne $1c07          wychylony joystick nr. 1
1bee lda trig0
1bf1 beq $1c07          nacinity przycisk w joysticku nr. 1
1bf3 lda porta
1bf6 and #$f0
1bf8 cmp #$f0
1bfa bne $1c17          wychylony joystick nr. 2
1bfc lda trig1
1bff beq $1c17          nacinity przycisk w joysticku nr. 2
1c01 lda #$1f
1c03 sta $091c
1c06 rts

1c07 lda porta          $091c = %000XYYYY
1c0a and #$0f
1c0c ldy trig0          X - fire, Y - wychylenie, gdzie kolejne bity
1c0f beq $1c13          odpowiadaj wychyleniu w prawo, lewo, d i gr
1c11 ora #$10
1c13 sta $091c
1c16 rts

1c17 lda porta          to samo co powyej (dla drugiego joysticka)
1c1a lsr @
1c1b lsr @
1c1c lsr @
1c1d lsr @
1c1e ldy trig1
1c21 jmp $1c0f

; Procedura ustawia w lokacji "przy windzie" ciank dziaow, jeeli windy
; nie ma akurat na danym pitrze

1c24 lda $090d          we nr lokacji Magic Knighta
1c27 sec                -1
1c28 sbc #$01
1c2a and #$07           pierwsze trzy bity to nr lok na pitrze liczony od 0
1c2c beq $1c2f          jeeli MK jest przy windzie -> $1c2f (dalsze sprawdz.)
1c2e rts                koniec - wszystko ok

1c2f lda $090d          we nr lokacji Magic Knighta
1c32 asl @              *2
1c33 tax                bdzie to indeks do tabeli pocze midzylokacyjnych
1c34 lda $4a37,x        we nr lokacji "po lewej"
1c37 cmp #$ff           czy istnieje taka lokacja?
1c39 beq $1c3c          nie (windy nie ma na pitrze) -> $1c3c (rysuj ciank)
1c3b rts                ok - nie ma rysowania cianki
1c3c lda #$00           ustaw offset dla bitmapy, ktr za chwil narysujemy
1c3e sta $0907          na $0e00
1c41 lda #$0e
1c43 sta $0909
1c46 lda #$e0           Na narysowany obiekt bdzie mona wskoczy i nie
1c48 sta $092d          bdzie mona przez niego przej
1c4b lda #$e4
1c4d jsr $0dea          Przetwrz palet ($e4) na kody poszczeglnych kolorw
1c50 lda #$53           we nr bitmapy bdcej "ciank dziaow"
1c52 jmp $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)

; Rozpoznaj, jaka litera znajduje si w kratce $cb,c - adres kratki,
; Wynik (kod Ascii) w A.

1c55 ldx #$41           rozpocznij sprawdzanie od litery 'A'
1c57 lda #$08           [$d5,6] = $8308 (adres matrycy litery 'A')
1c59 sta $d5
1c5b lda #$83
1c5d sta $d6
1c5f ldy #$00           rozpocznij od pierwszego wiersza matrycy
1c61 tya                Y = Y * 32
1c62 asl @
1c63 asl @
1c64 asl @
1c65 asl @
1c66 asl @
1c67 tay
1c68 lda ($cb),y        we bajt ze sprawdzanej kratki
1c6a sta $1c7a          wstaw jako argument dla CMP
1c6d tya                Y = Y / 32
1c6e lsr @
1c6f lsr @
1c70 lsr @
1c71 lsr @
1c72 lsr @
1c73 tay
1c74 lda ($d5),y        we bajt matrycy
1c76 jsr $0e15          Uwzgldnij aktualn palet kolorw
1c79 cmp #$00           czy jest taki sam, jak odczytany bajt z kratki?
1c7b bne $1c84          nie -> nastpna litera
1c7d iny                nastpna linia
1c7e cpy #$08           czy ju sprawdzono 8?
1c80 bne $1c61          nie -> sprawd nastpn lini
1c82 txa                kod Ascii litery na ktrej zatrzymao si wyszukiwanie
1c83 rts                do A

; Sprawd kolejn liter

1c84 lda $d5            [$d5,6] += 8
1c86 clc
1c87 adc #$08
1c89 sta $d5
1c8b bcc $1c8f
1c8d inc $d6
1c8f inx                nastpna litera
1c90 cpx #$5b           skocz sprawdzanie na literze 'Z' (= Chr($5A))
1c92 bne $1c5f          jeli to nie $5b -> kontynuuj przeszukiwanie
1c94 lda #$00           0 = nic nie znaleziono
1c96 rts

; Opcja 'A' - instructions

1c97 lda #$07           Rysuj okienko nr. 1
1c99 jsr $1727
1c9c ldx #$d6
1c9e ldy #$5d
1ca0 jsr $148b          drukuj: "GIMBALL HAS BEEN MAKING A MESS..."
1ca3 jsr $1cc5          czekaj, a zostanie nacinity przycisk joy'a         joysticka
1ca6 lda #$08           Rysuj okienko nr. 8
1ca8 jsr $1727
1cab ldx #$b0
1cad ldy #$5e
1caf jsr $148b          drukuj: "MOVEMENT..."
1cb2 jsr $1cc5          czekaj, a zostanie nacinity przycisk joy'a         joysticka
1cb5 lda #$09           Rysuj okienko nr. 9
1cb7 jsr $1727
1cba ldx #$f8
1cbc ldy #$5e
1cbe jsr $148b          drukuj "FEATURES..."
1cc1 jsr $1cc5          czekaj, a zostanie nacinity przycisk joy'a         joysticka
1cc4 rts

; Poczekaj, a zostanie nacinity i zwolniony przycisk joysticka

1cc5 jsr $1cdc          Czekaj na zwolnienie przycisku joysticka
1cc8 jsr $1ccf          Czekaj na nacinicie przycisku joysticka
1ccb jsr $1cdc          Czekaj na zwolnienie przycisku joysticka
1cce rts

; Czekaj na nacinicie przycisku joysticka

1ccf ldx #$ff           podczas 255 obiegw ptli musi by wcinity
1cd1 jsr $1be5
1cd4 and #$10
1cd6 bne $1ccf
1cd8 dex
1cd9 bne $1cd1
1cdb rts

; Czekaj na zwolnienie przycisku joysticka

1cdc ldx #$ff           podczas 255 obiegw ptli musi by zwolniony
1cde jsr $1be5
1ce1 and #$10
1ce3 beq $1cdc
1ce5 dex
1ce6 bne $1cde
1ce8 rts

; Procedura ustala, jaki skad powinno mie menu

1ce9 jsr $1d13          Czy umieci polecenie "COMMAND A CHARACTER"?
1cec jsr $1d2b          Czy umieci polecenie "LOCATE A CHARACTER"?
1cef jsr $1d43          Czy umieci polecenie "TELEPORT"?
1cf2 jsr $1d88          Czy umieci polecenie "READ SOMETHING"?
1cf5 jsr $1dab          Czy umieci polecenie "THROW SOMETHING"?
1cf8 jsr $1dd0          Czy umieci polecenie "CAST A SPELL"?
1cfb jsr $1df3          Czy umieci polecenie "BLOW SOMETHING"?
1cfe jsr $1d5b          Czy umieci polecenie "CALL LIFT"?
1d01 jsr $1d78          Czy umieci polecenie "MOVE LIFT"?
1d04 lda $090d          Czy Magic Knight znajduje si w windzie?
1d07 beq $1d0a          tak
1d09 rts
1d0a lda $091f          wwczas polecenia "LOCATE A CHARACTER" nie ma
1d0d and #$fd
1d0f sta $091f
1d12 rts

1d13 lda $091f          standardowo polecenia nie ma
1d16 and #$fe
1d18 sta $091f
1d1b lda #$07           Czy Magic Knight ma WAND OF COMMAND?
1d1d jsr $18eb
1d20 bne $1d2a          nie ma
1d22 lda $091f          Niech w menu wywietla si polecenie
1d25 ora #$01           "COMMAND A CHARACTER"
1d27 sta $091f
1d2a rts

1d2b lda $091f          standardowo polecenia nie ma
1d2e and #$fd
1d30 sta $091f
1d33 lda #$06           Czy Magic Knight ma Crystal Ball?
1d35 jsr $18eb
1d38 bne $1d42          nie ma
1d3a lda $091f          Niech w menu wywietla si polecenie
1d3d ora #$02           "LOCATE A CHARACTER"
1d3f sta $091f
1d42 rts

1d43 lda $091f          standardowo polecenia nie ma
1d46 and #$fb
1d48 sta $091f
1d4b lda #$30           Czy Magic Knight ma Teleport Key?
1d4d jsr $18eb
1d50 bne $1d5a          nie ma
1d52 lda $091f          Niech w menu wywietla si polecenie
1d55 ora #$04           "TELEPORT"
1d57 sta $091f
1d5a rts

1d5b lda $091f          standardowo polecenia nie ma
1d5e and #$7f
1d60 sta $091f
1d63 lda $090d          Czy Magic Knight znajduje si w windzie?
1d66 beq $1d77          tak
1d68 sec                odejmij 1 od numeru lokacji
1d69 sbc #$01
1d6b and #$07           Jeeli po usuniciu pierwszej cyfry jest on zerem,
1d6d bne $1d77
1d6f lda $091f          to niech w menu wywietla si polecenie
1d72 ora #$80           "CALL LIFT"
1d74 sta $091f
1d77 rts

1d78 lda $0920          standardowo polecenia nie ma
1d7b and #$fe
1d7d ldx $090d          Czy Magic Knight znajduje si w windzie?
1d80 bne $1d84          nie
1d82 ora #$01           Niech w menu znajduje si polecenie
1d84 sta $0920          "MOVE LIFT"
1d87 rts

1d88 lda $091f          standardowo polecenia nie ma
1d8b and #$f7
1d8d sta $091f
1d90 ldx #$04           Przegldaj po kolei wszystkie przedmioty Knighta
1d92 lda $044d,x        $44d - pocztek stanu posiadania Magic Knighta
1d95 jsr $1982          Zwr w $d9,a adres opisu przedmiotu o numerze w A
1d98 ldy #$02
1d9a lda ($d9),y
1d9c bne $1da2          Jeeli przedmiot ma "READ STATUS" ustawiony na 'yes',
1d9e dex
1d9f bpl $1d92
1da1 rts
1da2 lda $091f          to niech w menu wywietla si polecenie
1da5 ora #$08           "READ SOMETHING"
1da7 sta $091f
1daa rts

1dab lda $091f          standardowo polecenia nie ma
1dae and #$ef
1db0 sta $091f
1db3 ldx #$04           Przegldaj po kolei wszystkie przedmioty Knighta
1db5 lda $044d,x        $44d - pocztek stanu posiadania Magic Knighta
1db8 jsr $1982          Zwr w $d9,a adres opisu przedmiotu o numerze w A
1dbb ldy #$04           pobierz THROW/BLOW STATUS tego przedmiotu
1dbd lda ($d9),y
1dbf and #$02           wyodrbnij THROW STATUS
1dc1 bne $1dc7          jeeli mona rzuca -> $1dc7 (ustaw w menu pol. THROW)
1dc3 dex
1dc4 bpl $1db5
1dc6 rts
1dc7 lda $091f          niech w menu wywietla si polecenie "THROW SOMETHING"
1dca ora #$10
1dcc sta $091f
1dcf rts

1dd0 lda $091f          standardowo polecenia nie ma
1dd3 and #$df
1dd5 sta $091f
1dd8 ldx #$04           Przegldaj po kolei wszystkie przedmioty Knighta
1dda lda $044d,x        $44d - pocztek stanu posiadania Magic Knighta
1ddd jsr $1982          Zwr w $d9,a adres opisu przedmiotu o numerze w A
1de0 ldy #$03
1de2 lda ($d9),y
1de4 bne $1dea          Jeeli przedmiot ma 'MAGIC POWER',
1de6 dex
1de7 bpl $1dda
1de9 rts
1dea lda $091f          to niech w menu wywietla si polecenie
1ded ora #$20           "CAST A SPELL"
1def sta $091f
1df2 rts

1df3 lda $091f          standardowo polecenia nie ma
1df6 and #$bf
1df8 sta $091f
1dfb ldx #$04           Przegldaj po kolei wszystkie przedmioty Knighta
1dfd lda $044d,x        $44d - pocztek stanu posiadania Magic Knighta
1e00 jsr $1982          Zwr w $d9,a adres opisu przedmiotu o numerze w A
1e03 ldy #$04           pobierz THROW/BLOW STATUS tego przedmiotu
1e05 lda ($d9),y
1e07 and #$01           wyodrbnij BLOW STATUS
1e09 bne $1e0f          jeeli mona dmucha -> $1e0f (ustaw w menu pol. BLOW)
1e0b dex
1e0c bpl $1dfd
1e0e rts
1e0f lda $091f          niech w menu wywietla si polecenie "BLOW SOMETHING"
1e12 ora #$40
1e14 sta $091f
1e17 rts

; Zapisz X i Y do $30 i $31.

1e18 stx $30
1e1a sty $31
1e1c rts

; Zapisz X i Y do $32 i $32. Przekopiuj blok danych od adresu [$32] pod
; adres [$30]. A - liczba bajtw do skopiowania.

1e1d stx $32
1e1f sty $33
1e21 pha
1e22 tay
1e23 dey
1e24 cpy #$ff
1e26 beq $1e2f
1e28 lda ($32),y
1e2a sta ($30),y
1e2c jmp $1e23

; Zwiksz [$30] o liczb bajtw do skopiowania - zawarto A przed wywoaniem
; procedury $1e1d

1e2f pla
1e30 clc
1e31 adc $30
1e33 sta $30
1e35 bcc $1e39
1e37 inc $31
1e39 rts

; Procedura zwraca w X i Y pozycj kratkow pierwszej wolnej pozycji dla
; nowej postaci a w A numer pozycji. Przed wywoaniem numer lokacji musi by
; zapisany w $0921 a w $0922 numer postaci, dla ktrej poszukujemy miejsca.
; Jeeli miejsca nie ma w A zwracana jest warto 4.

1e3a sta $0921          zapisz do komrki pomocniczej numer lokacji
1e3d stx $0922          zapisz do komrki pomocniczej numer postaci
1e40 ldy #$02           wypenij zerami tablic pomocnicz na numery pozycji
1e42 lda #$00           postaci w danej lokacji
1e44 sta $1ef8,y
1e47 dey
1e48 bpl $1e44
1e4a lda #$7a           zainicjuj komrki $1e57,a (argument lda - poniej)
1e4c sta $1e59          adresem tabeli rozmieszczenia postaci: $047a
1e4f lda #$04
1e51 sta $1e5a
1e54 ldx #$00           inicjujemy licznik postaci, ktrych dane przegldamy
1e56 ldy #$00           inicjujemy na 0 indeks do tablicy pomocniczej ($1ef8)
1e58 lda irqmv+1        we bajt z tabeli rozm. postaci - nr lokacji postaci
1e5b cmp $0921          czy jest to ten sam numer co podany w A przy wywoaniu
1e5e bne $1e67          nie -> $1e67 (nie bierzemy tej postaci pod uwag)
1e60 lda $0528,x        we nr pozycji w lokacji dla tej postaci
1e63 sta $1ef8,y        wstawiamy j jako kolejny element do tablicy pomocn.
1e66 iny                zwikszamy o 1 indeks do tablicy pomocniczej
1e67 lda $1e59          zwiksz adres zawarty w komrkach $1e59,a
1e6a clc                (argument lda) o 3, tak, aby wskazywa na dane
1e6b adc #$03           okrelajce pooenie nastpnej postaci
1e6d sta $1e59
1e70 bcc $1e75
1e72 inc $1e5a
1e75 inx                zwiksz o 1 licznik postaci, ktrych dane przegldamy
1e76 cpx #$08           czy doszlimy ju do ostatniej (8-ej)?
1e78 bne $1e58          nie -> $1e58 (kontynuacja ptli)
1e7a lda #$01           na pocztku sprawdzimy, czy wolna jest pozycja nr 1
1e7c sta $1e85          w danej lokacji (zapisujemy 1 jako argument cmp)
1e7f ldy #$02           inicjujemy indeks do tabl. pomocniczej (ma 3 elementy)
1e81 lda $1ef8,y        we kolejny element z tablicy (uyt pozycj postaci)
1e84 cmp #$00           czy jest to pozycja, ktr sprawdzamy (arg. ustawiony)
1e86 beq $1e91          tak -> $1e91
1e88 dey                zmniejszamy indeks do tablicy
1e89 bpl $1e81          jeeli nie koniec -> $1e81 (kontynuacja ptli)
1e8b lda $1e85          we pozycj ktr sprawdzalimy (jest nieuywana)
1e8e jmp $1e9f          pobierz w X i Y wsprzdne tej pozycji i wyskocz
1e91 ldy $1e85          Pozycja jest uywana. Wstawiamy j do Y.
1e94 iny                bdziemy sprawdza nastpn,
1e95 sty $1e85          ktr zapisujemy jako argument cmp (powyej)
1e98 cpy #$04           czy doszlimy do pozycji 4 (ktra ju nie istnieje)?
1e9a bne $1e7f          nie -> $1e7f (kontynuacja sprawdzania)
1e9c lda #$04           zwracamy 4 - nie udao si znale wolnej pozycji
1e9e rts

; Procedura pomocnicza zwraca w X i Y wsprzdn X i Y (odpowiednio)
; pozycji o numerze podanym w A dla postaci o numerze podanym w $0922.
; W $921 powinien zosta zapisany numer lokacji, dla ktrej pozycji tej
; si poszukuje.

1e9f pha                wstaw na stos nr pozycji dla ktrej odczytujemy dane
1ea0 lda $0921          we numer lokacji z komrki pomocniczej
1ea3 asl @              *2
1ea4 clc
1ea5 adc $0921          dodaj nr lokacji (uzyskaj wynik mnoenia przez 3)
1ea8 sta $1edc          zapisz to jako modszy bajt argumentu lda (poniej)
1eab lda #$00           zapisz 0 do starszego bajtu argumentu
1ead sta $1edd
1eb0 asl $1edc          argument lda pomn przez 2
1eb3 rol $1edd          (dane lokacji zajmuj wic 2 * 3 miejsca = 6 bajtw)
1eb6 lda $1edc          do argumentu lda dodaj $7938 - pocztek tabeli z
1eb9 clc                dopuszczalnymi pozycjami w lokacjach
1eba adc #$38
1ebc sta $1edc
1ebf lda $1edd
1ec2 adc #$79
1ec4 sta $1edd
1ec7 pla                we numer pozycji dla ktrej maj by odczytane
1ec8 pha                wsprzdne
1ec9 sec                -1 (numeracja zaczyna si od 1)
1eca sbc #$01
1ecc asl @              *2
1ecd clc                dodaj do wyliczonego adresu pocztku tabeli
1ece adc $1edc          wsprzdnych pozycji dla danej lokacji
1ed1 sta $1edc
1ed4 bcc $1ed9
1ed6 inc $1edd
1ed9 ldy #$00           odczytaj i zapisz na stosie zawarto dwch kolejnych
1edb lda irqmv+1,y      komrek poczwszy od komrki o wyliczonym adresie
1ede pha
1edf iny
1ee0 cpy #$02
1ee2 bne $1edb
1ee4 pla                we ze stosu wsprzdn Y pozycji
1ee5 sta $1ef4          zapisz j jako argument ldy (poniej)
1ee8 pla                we ze stosu wsprzdn X pozycji
1ee9 sta $1ef6          zapisz j jako argument ldx (poniej)
1eec ldx $0922          wstaw do X nr postaci dla ktrej odczytalimy pozycj
1eef pla                we ze stosu (zapisany na pocztku proc.) nr pozycji
1ef0 sta $0528,x        wpisz go w odpowiednie miejsce do tablicy pozycji
1ef3 ldy #$00           argumenty ldy i ldx zostay ustawione
1ef5 ldx #$00
1ef7 rts
1ef8 dta 0,0,0

; Procedura wylicza w komrkach $dd,e adres bajtu odpowiadajcego pikselowi
; o wsprzdnych podanych w rejestrach X i Y (wsprzdne podane s pikselach
; trybu gr. 8, czyli najmodszy bit w rej. Y jest nieznaczcy). Dodatkowo,
; w komrce $092a obliczana jest liczba bitw, o jakie bdzie trzeba przesun
; w prawo mask.

1efb txa                przelij pozycj X pieczki do A
1efc lsr @              /8 - powstanie numer bajtu od pocztku linii, ktry
1efd lsr @                   trzeba eorowa (wsprzdne s podane w pikselach
1efe lsr @                   trybu gr. 8)
1eff sta $1f0a          zapisz to jako argument ora (poniej)
1f02 tya                przelij pozycj Y pieczki do A
1f03 ror @              przenie 3 najmodsze bity A do 3 najstarszych
1f04 ror @              (warto C bdzie tutaj nieistotna)
1f05 ror @
1f06 ror @
1f07 and #$e0           uzyskaj 3 najst. bity (czyli modszy bajt wsp. Y * 32)
1f09 ora #$00           dodaj nr bajtu od pocztku linii wyliczony wczeniej
1f0b sta $dd            zapisz to jako modszy bajt wyliczonego adresu
1f0d tya                przelij pozycj Y pieczki do A
1f0e lsr @              /8 - oblicz numer strony liczc od pocztku pamici
1f0f lsr @                   obrazu, od ktrej naley rozpocz wyw. bitmapy
1f10 lsr @                   (8 * 32 bajty w linii = 256 bajtw = 1 strona)
1f11 clc                +$88 (numer strony od ktrego zaczyna si pam. obr.)
1f12 adc #$88
1f14 sta $de            zapisz to jako starszy bajt wyliczanego adresu
1f16 txa                ponownie przelij pozycj X pieczki do A
1f17 and #$07           najm. 3 bity okrelaj, o ile bitw przesun mask
1f19 sta $092a          zapisz t liczb w komrce pomocniczej
1f1c rts

; Procedura wywietla na ekranie bitmap przypisan pieczce w miejscu o
; wsprzdnych zawartych w rejestrach X i Y (w pikselach trybu gr. 8).
; W A znajduje si numer bitmapy przypisanej pieczce

1f1d pha                zapisz nr bitmapy przypisanej pieczce na stosie
1f1e jsr $1efb          obl. w $dd,e adres bajtu pam. obr. a w $092a przesun.
1f21 lda #$00           inicjuj na 0 starszy bajt adresu komrki z pocztkiem
1f23 sta $1f42          bitmapy
1f26 pla                we nr bitmapy przypisanej pieczce ze stosu
1f27 asl @              pomn A (o wartociach $20, $77, $76, $75 lub $74)
1f28 asl @              przez 8 zachowujc starszy bajt w komrce $1f42 -
1f29 rol $1f42          powstanie offset pocztku bitmapy wzgldem pocztku
1f2c asl @              tablicy
1f2d rol $1f42
1f30 clc                (pusta instrukcja)
1f31 adc #$00
1f33 sta $1f41          zapisz modszy bajt adresu pocztku danej bitmapy
1f36 lda $1f42          we starszy bajt offsetu
1f39 adc #$84           i dodaj starszy bajt adresu pocztku wzorw znakw
1f3b sta $1f42          co utworzy starszy bajt adresu pocztku bitmap
1f3e ldx #$00           X = liczba przetworzonych linii ekranu
1f40 lda irqmv+1,x      we kol. bajt wzoru pieczki, z ktrym bdiemy eor.
1f43 sta $1f78          wstaw go do pierwszej komrki pomocniczej
1f46 lda #$00           do drugiej wstaw 0
1f48 sta $1f79
1f4b ldy $092a          we liczb poz. o jakie trzeba przesun w prawo mask
1f4e beq $1f59          jeeli jest zerowa -> $1f59 (nie przesuwamy)
1f50 lsr $1f78          przesu mask o 1 pozycj w prawo
1f53 ror $1f79          zap najmodszy bit jako bit maski dla nast. bajtu
1f56 dey                zmniejsz o 1 liczb przesuni do wykonania
1f57 bne $1f50          jeeli jest niezerowa -> $1f50 (kont. przesuwania)
1f59 ldy #$00           Y = indeks do pierwszego eorowanego bajtu pam. ekranu
1f5b lda ($dd),y        we bajt pamici ekranu
1f5d eor $1f78,y        wykonaj eorowanie z odp. bajtem z tablicy
1f60 sta ($dd),y        zapisz bajt w to samo miejsce
1f62 iny                zwiksz indeks do pamici ekranu
1f63 cpy #$02           czy przetworzono ju 2 bajty?
1f65 bne $1f5b          nie -> $1b5b (kontynuacja eorowania)
1f67 lda $dd            zwiksz $dd,e o $20 (l. bajtw w jednej linii ekranu)
1f69 clc
1f6a adc #$20
1f6c sta $dd
1f6e bcc $1f72
1f70 inc $de
1f72 inx                zwiksz o 1 liczb przetworzonych linii ekranu
1f73 cpx #$08           czy przetworzono 8?
1f75 bne $1f40          nie -> $1f40 (eorowanie nastpnej linii)
1f77 rts

; Dwie komrki pomocnicze zawierajce mask, poprzez ktr wykonywane jest
; eorowanie podczas rysowania pieczki

1f78 dta 0, 0

; Procedura wykonuje ruch pieczk (tak jak w lokacji "THE BALLROOM") o
; numerze przekazanym w A

1f7a asl @              numer pieczki *8 (jest 8 bajtw z danymi pieczki,
1f7b asl @                                 lecz 3 z nich s zerami)
1f7c asl @
1f7d pha                bdzie to indeks to tablicy z danymi pieczek,
1f7e tax                ktry zapisujemy w rejestrze X i na stosie
1f7f ldy #$00           zainicjuj na 0 indeks do tabl. danych pieczki
1f81 lda $204c,x        we bajt danych pieczki
1f84 sta $206c,y        skopiuj go obszaru tymczasowego
1f87 inx                zwikszenie o 1 indeksw
1f88 iny
1f89 cpy #$05           czy przekopiowano ju 5 bajtw?
1f8b bne $1f81          nie -> $1f81 (kontynuacja)
1f8d ldx $206c          we do X pozycj X pieczki w pikselach trybu gr. 8
1f90 ldy $206d          we do Y pozycj Y pieczki w pikselach trybu gr. 8
1f93 lda $2070          we numer bitmapy przypisanej poprzednio pieczce
1f96 jsr $1f1d          wykowanaj eorowanie zawartoci ekranu z bitmap pi.
1f99 lda $206c          we do X pozycj X pieczki w pikselach trybu gr. 8
1f9c clc                dodaj przyrost dla wsprzdnej X pozycji pieczki
1f9d adc $206e
1fa0 tax                X = nowa pozycja pozioma pieczki
1fa1 lda $206d          we do Y pozycj Y pieczki w pikselach trybu gr. 8
1fa4 clc                dodaj przyrost dla wsprzdnej Y pozycji pieczki
1fa5 adc $206f
1fa8 tay                Y = nowa pozycja pionowa pieczki
1fa9 stx $206c          zapisz nowe pozycje X i Y do odpowiednich komrek
1fac sty $206d
1faf lda $2070          we numer bitmapy przypisanej poprzednio pieczce
1fb2 sec                -$75
1fb3 sbc #$75
1fb5 and #$03           we dwa ostatnie bity
1fb7 clc                +$74, co pozwala otrzyma w kolejnych wykonaniach
1fb8 adc #$74           wartoci: $77, $76, $75, $74, $77, $76, $75 itd
1fba sta $2070          zapisz to jako numer nastpnej bitmapy
1fbd jsr $1f1d          wykowanaj eorowanie zawartoci ekranu z bitmap pi.
1fc0 ldx #$00           inicjuj rejestr X, tak, by by indeksem do pozycji X
1fc2 lda $206c,x        we pozycj X pieczki
1fc5 bne $1fca          jeeli niezerowa -> $1fca (brak zmiany przyrostu X)
1fc7 jsr $203a          zmie przyrost X na przeciwny
1fca cmp #$f4           czy pozycja X jest rwna $f4?
1fcc bne $1fd1          nie -> $1fd1 (brak zmiany przyrostu X)
1fce jsr $203a          zmie przyrost X na przeciwny
1fd1 inx                zwiksz X o 1, tak by by to indeks do nast. wsprz.
1fd2 lda $206c,x        we pozycj Y pieczki
1fd5 cmp #$08           czy jest rwna 8 (gra ekranu)?
1fd7 bne $1fdc          nie -> $1fdc (brak zmiany przyrostu Y)
1fd9 jsr $203a          zmie przyrost Y na przeciwny
1fdc cmp #$88           czy jest rwna $88 (d okna zawierajcego pole gry)
1fde bne $1fe3          nie -> $1fe3 (brak zmiany przyrostu Y)
1fe0 jsr $203a          zmie przyrost Y na przeciwny
1fe3 pla                odtworzenie ze stosu ind. do tablicy danych pieczek
1fe4 tax                umieszczenie go w X
1fe5 ldy #$00           zainicjowanie na 0 indeksu do obszaru tymczasowego
1fe7 lda $206c,y        we bajt danych pieczki z obszaru tymczasowego
1fea sta $204c,x        skopiuj go w poprzednie miejsce
1fed inx                zwikszenie o 1 indeksw
1fee iny
1fef cpy #$05           czy przekopiowano ju 5 bajtw?
1ff1 bne $1fe7          nie -> $1fe7 (kontynuacja)
1ff3 lda $206c          we pozycj X pieczki
1ff6 clc                dodaj jej szeroko
1ff7 adc #$06
1ff9 sec                odejmij aktualn wsprz. X MK w pikselach trybu gr. 8
1ffa sbc $0445
1ffd cmp #$15           jeeli powstanie maa liczba dodatnia i jeeli po
1fff bcs $2039          odjciu od niej $15 bdzie C=0, wwczas jest kolizja X
2001 lda $206d          we pozycj Y pieczki
2004 clc                dodaj jej wysoko
2005 adc #$06
2007 sec                odejmij aktualn poz. Y MK w pikselach trybu gr. 8
2008 sbc $0446
200b cmp #$27           jeeli powstanie maa liczba dodatnia i jeeli po
200d bcs $2039          odjciu od niej $27 bdzie C=0, wwczas jest kolizja Y
200f dec $03fd          Zmniejsz o 1 si Magic Knighta
2012 lda #$00           wcz standardowe dwiki (bez filtrw, kanay osobno)
2014 sta audctl
2017 lda #$af           ustaw kana dwikowy nr 1 na czyste dwiki i max.
2019 sta audc1          gono
201c ldy #$ff           Y bdzie zawiera wysoko dwiku
201e sty audf1          wstaw wysoko dwiku do audf1
2021 dey                zmniejsz j o 1
2022 bne $201e          jeeli rna od 0 -> $201e (kontynuacja efektu)
2024 lda #$a0           wycisz kana 1
2026 sta audc1
2029 jsr $18fb          Rysuj pasek energii (jeli Magic Knight ma Mirror)
202c lda $03fd          we si Magic Knighta
202f bne $2038          jeli niezerowa -> skok do $2038 (rts)
2031 ldx #$9e           drukuj "YOU DIED OF EXHAUSTION..." i zakocz gr
2033 ldy #$52
2035 jmp $2c49
2038 nop                powrt - MK zostao jeszcze troch energii
2039 rts

; Procedura zmienia przyrost X lub Y pieczki na liczb o przeciwnym znaku.
; O tym, dla ktrej wsprzdnej nastpuje zmiana przyrostu decyduje rejestr
; X, ktry powinien zawiera indeks do bajtu zawierajcego wart. wsprzdnej

203a inx                zwiksz X o 2 tak, aby by to indeks do bajtu
203b inx                zawierajcego przyrost wsprzdnej poz. lub pionowej
203c lda $206c,x        we bajt danych bdcy przyrostem pewnej wsprzdnej
203f eor #$ff           zmnie znak, tak, jak na liczbie ze znakiem
2041 clc                (negacja bitw i dodanie 1)
2042 adc #$01
2044 sta $206c,x        zapisz przyrost w odpowiednim miejscu
2047 dex                przywr poprzedni warto X (indeks do wsprzdnej)
2048 dex
2049 lda #$ff           zwr warto, ktra spowoduje, e nie zadziaa adne
204b rts						cmp, ktre znajduje si po wywoaniu procedury $203a

; Tabela z danymi pieczek - jeden wiersza zawiera dane dla jednej pieczki
; Kolejno: pozycja X i Y pieczki (w pikselach trybu gr. 8), przyrost pozycji
;          X, przyrost pozycji Y, numer bitmapy przypisanej pieczce, 3 zera
;          (bajty nieznaczce)

204c dta $0c, $70, $04, $02, $20, $00, $00, $00
2054 dta $0c, $70, $02, $fc, $20, $00, $00, $00
2054 dta $c8, $78, $fc, $02, $20, $00, $00, $00
2064 dta $c8, $78, $fe, $fc, $20, $00, $00, $00

; Miejsce na tymczasowe przechowywanie pierwszych 5 bajtw z danych pieczki

206c dta $00, $00, $00, $00, $00

; Narysuj menu i wykonaj polecenie

2071 jsr $40e9          Efekt dwikowy nr. 2
2074 ldx #$09           zlicz liczb ustawionych bitw (rejest Y)
2076 ldy #$00           w bajtach znajdujcych si w komrkach pamici
2078 lda $0920          $091f i $0920
207b lsr @
207c lda $091f
207f ror @
2080 bcc $2083          jest to 0 -> przeskocz INY
2082 iny
2083 dex
2084 bne $207f
2086 tya                liczba zliczonych dodatkowych pozycji w menu do A
2087 clc
2088 adc #$09           + 9
208a clc                dodaj to do grnej pozycji okienka nr. 0, ktre zaraz
208b adc $4aad          narysujemy
208e sta $4aae          zapisz to jako doln pozycj okienka nr. 0
2091 lda #$00           narysuj okienko ze strzak o numerze 0
2093 jsr $171e
2096 ldx #$2f           drukuj tekst "COMMANDS AVAILABLE :- PICK UP, DROP..."
2098 ldy #$53
209a jsr $148b
209d lda #$00           Ustaw $cb,c na adres pocztku linijki, w ktrej
209f sta $cb            znajduje si polecenie "EXAMINE". Poniewa nazwa
20a1 lda #$8f           kadego polecenia poprzedzona jest znakiem <nl>,
20a3 sta $cc            polecenia dodatkowe bd w linijkach za "EXAMINE".
20a5 ldx #$00           pierwsze polecenie dodatkowe ma numer 0
20a7 ldy #$09           jest maksymalnie 9 polece dodatkowych
20a9 lda $0920          sprawd, czy kolejne polecenie dodatkowe powinno
20ac lsr @              by dostpne
20ad lda $091f
20b0 ror @
20b1 bcc $20b6          nie byo jedynki (C = 0) -> nie
20b3 jsr $20ec          drukuj nazw polecenia dodatkowego
20b6 inx                X += 2, bo jest to indeks w tablicy adresw polece
20b7 inx
20b8 dey                czy to ju wszystkie polecenia dodatkowe?
20b9 bne $20b0          nie -> drukuj nastpne
20bb ldx #$63           drukuj polecenie "Z - EXIT MENU"
20bd ldy #$53
20bf jsr $148b
20c2 jsr $1af6          zwr w A identyfikator wybranej joystickiem pozycji
20c5 ldx #$00           sprawd, jakie polecenie wybrano (od pierwszego
20c7 cmp $4a9b,x        dostpnego)
20ca beq $20da          jest!
20cc inx                nastpne
20cd cpx #$0f           czy ju wszystkie?
20cf bne $20c7          tak -> powtrz ptl
20d1 lda $0948          zablokuj moliwo wykonywania polece na GIMBALLU
20d4 and #$fe
20d6 sta $0948
20d9 rts

; Skocz do procedury obsugi polecenia o numerze podanym w X

20da txa
20db asl @
20dc tax                X = X * 2
20dd lda $2c8a,x        tablica znajduje si pod adresem $2c8a
20e0 sta $20ea          modszy bajt
20e3 lda $2c8b,x
20e6 sta $20eb          starszy bajt
20e9 jmp $ffff          skacz!

; Procedura drukuje w otwartym ju okienku menu nazw polecenia dodatkowego
; (ktre nie zawsze musi by dostpne) o numerze podanym w X (przemnoonym
; przez 2)

20ec pha                A, X i Y na stos
20ed txa
20ee pha
20ef tya
20f0 pha
20f1 lda $210a,x        we modszy bajt adresu z nazw polecenia
20f4 sta $20fe
20f7 lda $210b,x        we starszy bajt adresu z nazw polecenia
20fa sta $2100
20fd ldx #$00           argument LDX jest modszym bajtem adresu
20ff ldy #$00           argument LDY jest starszym bajtem adresu
2101 jsr $148b          drukuj!
2104 pla                odtwrz Y, X, A ze stosu
2105 tay
2106 pla
2107 tax
2108 pla
2109 rts

210a dta a($5370)       C - COMMAND A CHARACTER
     dta a($5378)       L - LOCATE A CHARACTER
     dta a($5380)       X - TELEPORT
     dta a($5385)       R - READ SOMETHING
     dta a($538b)       Y - THROW SOMETHING
     dta a($5391)       S - CAST A SPELL
     dta a($5399)       B - BLOW SOMETHING
     dta a($53a3)       W - CALL LIFT
     dta a($53ad)       V - MOVE LIFT

; Wydrukuj okienko z tekstem "PRESS FIRE TO CONTINUE" i poczekaj na
; nacinicie fire

211c jsr $40ef          Efekt dwikowy nr. 4
211f lda #$0e           Rysuj okienko nr. $e
2121 jsr $1727
2124 ldx #$8a           drukuj: "PRESS FIRE TO CONTINUE"
2126 ldy #$4f
2128 jsr $148b
212b jsr $1ccf          Czekaj na nacinicie przycisku joysticka
212e jsr $1cdc          Czekaj na zwolnienie przycisku joysticka
2131 jsr $40e6          Efekt dwikowy nr. 1
2134 rts

; Otwrz u dou ekranu okienko "COMMAND"

2135 lda #$00           numer ostatnio rysowanego okienka na stos
2137 pha
2138 lda $cb            zachowaj na stosie adres koca tekstu w okienku
213a pha                aktualnie otwartym na ekranie
213b lda $cc
213d pha
213e lda $090e          przechowaj na stosie pozycj okienka, ktre ju
2141 pha                jest na ekranie widoczne
2142 lda $090f
2145 pha
2146 lda $0910
2149 pha
214a lda $0911
214d pha
214e lda #$01           Rysuj okienko nr. 1
2150 jsr $1727
2153 ldx #$ef
2155 ldy #$4f
2157 jsr $148b          drukuj w okienku "COMMAND"
215a lda $cb            adres koca tekstu w okienku "COMMAND" bdzie zapisany
215c sta $df            w $df,e0 i bdzie musia by stamtd przepisywany do
215e lda $cc            $cb,c przy kadym drukowaniu
2160 sta $e0
2162 pla                odtwrz ze stosu pozycj okienka, ktre jest ju
2163 sta $0911          widoczne na ekranie
2166 pla
2167 sta $0910
216a pla
216b sta $090f
216e pla
216f sta $090e
2172 pla                odtwrz ze stosu pozycj koca tekstu okienka
2173 sta $cc            poprzednio wykorzystywanego
2175 pla
2176 sta $cb
2178 pla                odtwrz ostatni nr okienka (czyli rysowanie
2179 sta $2136          okienka "COMMAND" nie zmienia nr okienka w $2136)
217c rts

; Nieuywana procedura czyszczca prawie cay ekran gry, z wyjtkiem
; dolnego wiersza cegie lub trawy, po ktrym porusza si Magic Knight.

217d lda #$00
217f sta $30
2181 lda #$88
2183 sta $31
2185 ldy #$00
2187 lda #$00
2189 sta ($30),y
218b iny
218c bne $2187
218e inc $31
2190 lda $31
2192 cmp #$9a
2194 bne $2187
2196 rts

; Procedura drukuje dane w narysowanym ju, pomocniczym okienku u dou ekranu.
; X, Y - modszy i starszy bajt tekstu do wydrukowania

2197 lda $cb            zachowaj na stosie pozycj koca tekstu w okienku
2199 pha                aktualnie otwartym
219a lda $cc
219c pha
219d lda $0e10          jak rwnie uywan palet kolorw
21a0 pha
21a1 lda #$66
21a3 jsr $0dea          Przetwrz palet ($66) na kody poszczeglnych kolorw
21a6 lda $df            przepisz adres koca tekstu w okienku pomocniczym
21a8 sta $cb            (zapisany w $df,e0) do $cb,c, gdy komrki te
21aa lda $e0            wykorzystuje procedura drukujca
21ac sta $cc
21ae jsr $148b          drukuj tekst w okienku pomocniczym
21b1 lda $cb            zapamitaj ponownie w $df,e0 adres koca tekstu w
21b3 sta $df            okienku pomocniczym
21b5 lda $cc
21b7 sta $e0
21b9 pla                odtwrz palet
21ba jsr $0dea          Przetwrz palet na kody poszczeglnych kolorw
21bd pla                odtwrz ze stosu pozycj koca tekstu w okienku
21be sta $cc            poprzednio wykorzystywanym
21c0 pla
21c1 sta $cb
21c3 rts

; Procedura zapisuje do tablicy trzyelementowej o adresie $220b numery kolejne postaci
; postaci znajdujcych si w pokoju o numerze przekazanym w A.
; Procedura zwraca liczb zapisanych elementw tablicy

21c4 sta $21ee          numer pokoju zapamitujemy jako argument CMP (poniej)
21c7 txa                X na stos
21c8 pha
21c9 tya                Y na stos
21ca pha
21cb ldx #$02           trzyelementow tablic o adresie $220b wypeniamy
21cd lda #$ff           wartociami $ff
21cf sta $220b,x
21d2 dex
21d3 bpl $21cf
21d5 ldx #$15           normalnie jest 7 postaci ($15 = 7 * 3)
21d7 lda $0915          sprawd, czy MK upuci ju GLOWING BOTTLE
21da and #$01           (czy jest BANSHEE)
21dc beq $21e0          nie -> $21e0
21de ldx #$18           jest 8 postaci! ($18 = 8 * 3)
21e0 stx $21fe          zapisz t liczb jako argument CPX (poniej)
21e3 ldx #$00           zaczynamy od przegldania danych pierwszej postaci
21e5 stx $21f2          numer tej postaci zapisz jako argument LDA (poniej)
21e8 ldy #$00           bdziemy wypenia tablic poczwszy od 1-go elementu
21ea lda $047a,x        we numer pokoju, w ktrym znajduje si kolejna posta
21ed cmp #$00           czy jest on rwny numerowi pokoju przeszukiwanego?
21ef bne $21f7          nie -> $21f7
21f1 lda #$00           we numer postaci (argument LDA jest ustawiony)
21f3 sta $220b,y        zapisz ten numer jako kolejny element tablicy poniej
21f6 iny                zwiksz Y, aby pniej zapisa jej kolejny element
21f7 inc $21f2          zwikszamy numer postaci o 1 (np. z 1 na 2)
21fa inx                zwikszamy X o 3 (dane jednej postaci zajmuj 3 bajty)
21fb inx
21fc inx
21fd cpx #$00           czy ostatnia posta (argument CPX jest ustawiony)?
21ff bne $21ea          nie -> $21ea
2201 sty $2209          liczb zapisanych elementw wpisz jako argument LDA
2204 pla                we Y ze stosu
2205 tay
2206 pla                we X ze stosu
2207 tax
2208 lda #$00           we ustawion poprzednio liczb zapisanych elementw
220a rts
220b dta 0, 0, 0

; Procedura wywietla okienko EXECUTE/REJECT COMMAND. Jeli gracz wybierze
; EXECUTE, wwczas sterowanie wraca do procedury woajcej, w przeciwnym
; razie do procedury nadrzdnej.

220e jsr $40ef          Efekt dwikowy nr. 4
2211 lda #$0b           narysuj okienko ze strzak o numerze $0b
2213 jsr $171e
2216 ldx #$a4
2218 ldy #$4f
221a jsr $148b          drukuj: "EXECUTE COMMAND...REJECT COMMAND"
221d jsr $1af6          zwr w A identyfikator wybranej joystickiem pozycji
2220 cmp #$45           czy gracz wybra opcj EXECUTE COMMAND (E = CHR($45))
2222 bne $2225          nie -> przeskok rts
2224 rts
2225 pla                zdjcie ze stosu adresu powrotu do procedury
2226 pla                realizacji polecenia
2227 jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr

; Procedura przetwarza identyfikator (liter) wybieranej wanie joystickiem
; pozycji z nazw postaci na jej identyfikator, ktry zapisywany jest do $0913

222a sec                A -= $41 (kod litery 'A')
222b sbc #$41
222d tax                przelij numer pozycji (liczony od zera) do X
222e lda $220b,x        pobierz identyfikator postaci o tym numerze
2231 sta $0913          przelij go do komrki pomocniczej
2234 ldx #$3c           drukuj w pomocniczym okienku u dou ekranu znak o
2236 ldy #$22           kodzie $1f - skrtow nazw postaci o numerze w $0913
2238 jsr $2197
223b rts

223c dta $1f, $00			napis bdcy skrtow nazw postaci
223e dta $1e, $00			napis bdcy pen nazw postaci

; Procedura czeka na synchronizacj pionow (przerwanie VVBLK)

2240 lda $0946          we zawarto licznika wykona procedury VVBLK
2243 cmp $0946          porwnaj z zawartoci licznika po chwili
2246 beq $2243          jeeli to samo -> $2243 (nie byo przerwania VVBLK)
2248 rts

; Procedura odczekuje 1/5 (10/50) sekundy

2249 ldx #$0a           zainicjuj licznik ptli
224b jsr $2240          czekaj na przerwanie VVBLK
224e dex                zmniejsz licznik ptli
224f bne $224b          jeeli niezerowy -> $224b (kontynuacja ptli)
2251 rts

; Drukuj tekst "YOUR HANDS ARE FULL"

2252 ldx #$fe
2254 ldy #$57
2256 jmp $23ed

; Drukuj tekst "THAT OBJECT IS TOO HEAVY"

2259 ldx #$10
225b ldy #$58
225d jmp $23ed

; Drukuj tekst "THERE IS NOTHING NEAR ENOUGH"

2260 ldx #$ed
2262 ldy #$57
2264 jmp $23ed

; Drukuj tekst "THERE IS NOTHING IN THIS ROOM"

2267 ldx #$e2
2269 ldy #$57
226b jmp $23ed

; Drukuj tekst "YOU CANNOT DROP THAT OBJECT"

226e ldx #$80
2270 ldy #$58
2272 jmp $23ed

; Drukuj tekst "GIMBAL'S HANDS ARE EMPTY"

2275 ldx #$11
2277 ldy #$59
2279 jmp $23ed

; Drukuj tekst "GIMBAL WANTS TO KEEP THAT"

227c ldx #$26
227e ldy #$59
2280 jmp $23ed

; Drukuj tekst "GIMBAL'S HANDS ARE FULL"

2283 ldx #$d5
2285 ldy #$59
2287 jmp $23ed

; Drukuj tekst "GIMBAL IS NOT STRONG ENOUGH"

228a ldx #$e9
228c ldy #$59
228e jmp $23ed

; Drukuj tekst "GIMBAL DOES NOT WANT THAT YET"

2291 ldx #$ff
2293 ldy #$59
2295 jmp $23ed

; Drukuj tekst "GIMBAL IS ALREADY ASLEEP"

2298 ldx #$c4
229a ldy #$5c
229c jmp $23f7

; Drukuj tekst "GIMBAL IS TOO WAKEFUL TO SLEEP"

229f ldx #$d3
22a1 ldy #$5c
22a3 jmp $23f7

; Drukuj tekst "GIMBAL DOES NOT WANT TO BE COMMANDED BY YOU"

22a6 ldx #$a4
22a8 ldy #$5c
22aa jmp $23f7

; Drukuj tekst "GIMBAL IS ALREADY AWAKE"

22ad ldx #$00
22af ldy #$5d
22b1 jmp $23f7

; Drukuj tekst "GIMBAL IS TOO TIRED TO WAKE UP"

22b4 ldx #$0e
22b6 ldy #$5d
22b8 jmp $23f7

; Drukuj tekst "GIMBAL IS TOO TIRED TO GO AWAY"

22bb ldx #$2a
22bd ldy #$5d
22bf jmp $23f7

; Drukuj tekst "GIMBAL CANNOT HELP YOU"

22c2 ldx #$47
22c4 ldy #$5d
22c6 jmp $23f7

; Drukuj tekst "... IS TOO TIRED TO HELP YOU" - bd w tekcie komunikatu

22c9 ldx #$55
22cb ldy #$5d
22cd jmp $23f7

; Drukuj tekst "GIMBAL HAS NO FOOD LEFT"

22d0 ldx #$5b
22d2 ldy #$5d
22d4 jmp $23f7

; Drukuj tekst "GIMBAL IS TOO TIRED TO EAT OR DRINK"

22d7 ldx #$6f
22d9 ldy #$5d
22db jmp $23f7

; Drukuj tekst "GIMBAL IS TOO TIRED TO BE HAPPY"

22de ldx #$99
22e0 ldy #$5d
22e2 jmp $23f7

; Drukuj tekst "THE LIFT IS HERE"

22e5 ldx #$d3
22e7 ldy #$6e
22e9 lda #$18
22eb jmp $2401

; Drukuj tekst "THE LIFT HAS ARRIVED"

22ee ldx #$0f
22f0 ldy #$6f
22f2 lda #$18
22f4 jmp $2401

; Drukuj tekst "WHAT A RACKET..."

22f7 ldx #$65
22f9 ldy #$6d
22fb lda #$1b
22fd jmp $2401

; Drukuj tekst "WHAT A LOT OF DUST..."

2300 ldx #$13
2302 ldy #$6e
2304 lda #$1b
2306 jmp $2401

; Drukuj tekst "THERE IS NO WRITING FOR ME TO READ"

2309 ldx #$50
230b ldy #$5f
230d lda #$0c
230f jmp $2401

; Drukuj tekst "IT IS NOT SAFE TO TELEPORT"

2312 ldx #$35
2314 ldy #$6b
2316 lda #$11
2318 jmp $2401

; Drukuj tekst "THE LIQUID IS STUCK TO THE FLOOR..."

231b ldx #$23
231d ldy #$58
231f jmp $23ed

; Drukuj tekst "GIMBAL THE WIZARD IS ASLEEP"

2322 ldx #$9a
2324 ldy #$6d
2326 jmp $23f2

; Drukuj tekst "GIMBAL THE WIZARD DOES NOT WANT TO BE SUMMONED"

2329 ldx #$a5
232b ldy #$6d
232d jmp $23f2

; Drukuj tekst "GIMBAL THE WIZARD IS TOO TIRED TO BE SUMMONED"

2330 ldx #$c3
2332 ldy #$6d
2334 jmp $23f2

; Drukuj tekst "GIMBAL THE WIZARD IS ALREADY HERE"

2337 ldx #$de
2339 ldy #$6d
233b jmp $23f2

; Drukuj tekst "GIMBAL THE WIZARD DOES NOT WANT TO COME TO SUCH A CROWDED..."

233e ldx #$ea
2340 ldy #$6d
2342 jmp $23f2

; Drukuj tekst "GIMBAL THE WIZARD APPEARS IN A THICK PUFF OF SMOKE"

2345 ldx #$47
2347 ldy #$6e
2349 jmp $23f2

; Drukuj tekst "THAT SPELL CANNOT YET BE CAST..."

234c ldx #$a3
234e ldy #$67
2350 jmp $23fc

; Drukuj tekst "THE SPELL HAS WORKED! GIMBAL IS NEARLY FREE"

2353 ldx #$35
2355 ldy #$68
2357 jmp $23fc

; Drukuj tekst "SUCCESS! GIMBAL IS FREE AT LAST"

235a ldx #$55
235c ldy #$68
235e jmp $23fc

; Drukuj tekst "WELL DONE, THE CANDLE IS NOW GLOWING..."

2361 ldx #$70
2363 ldy #$68
2365 jmp $23fc

; Drukuj tekst "THE LIQUID TURNED TO A VAPOUR..."

2368 ldx #$b5
236a ldy #$68
236c jmp $23fc

; Drukuj tekst "GIMBAL IS ALREADY FREE"

236f ldx #$25
2371 ldy #$6a
2373 jmp $23fc

; Drukuj tekst "THE CANDLE IS ALREADY ALIGHT"

2376 ldx #$30
2378 ldy #$6a
237a jmp $23fc

; Drukuj tekst "YOUR ARMOUR IS GLOWING ALREADY"

237d ldx #$3f
237f ldy #$6a
2381 jmp $23fc

; Drukuj tekst "YOU HAVE ALL THE PROTECTION YOU NEED AGAINST GAS ALREADY"

2384 ldx #$55
2386 ldy #$6a
2388 jmp $23fc

; Drukuj tekst "THE FUMES FROM THE PLANT & FISH..."

238b ldx #$60
238d ldy #$69
238f jmp $23fc

; Drukuj tekst "YOUR SPIRIT FLOWS THROUGH THE GATES..."

2392 ldx #$de
2394 ldy #$69
2396 jmp $23fc

; Drukuj tekst "YOU HEAR A SHORT RANGE TELEPAHIC WHISPER FROM GIMBALL..."

2399 ldx #$64
239b ldy #$6b
239d jmp $23fc

; Drukuj tekst "THE BLUE CRYSTAL FLEW AT GIMBAL..."

23a0 ldx #$be
23a2 ldy #$6b
23a4 jmp $23fc

; Drukuj tekst "THE RED CRYSTAL FLEW STRAIGHT AT GIMBAL..."

23a7 ldx #$35
23a9 ldy #$6c
23ab jmp $23fc

; Drukuj tekst "THE GREEN CRYSTAL FLEW AT GIMBAL..."

23ae ldx #$d2
23b0 ldy #$6c
23b2 jmp $23fc

; Drukuj tekst "THE NOTHING AT ALL LANDED ON THE FLOOR BY GIMBAL"

23b5 ldx #$3c
23b7 ldy #$6d
23b9 jmp $23fc

; Drukuj tekst "THE LIFT IS BROKEN AND CANNOT BE MOVED TO THAT FLOOR YET..."

23bc ldx #$2d
23be ldy #$6f
23c0 lda #$18
23c2 jmp $2401

; Drukuj tekst "GIMBAL HAS GONE TO SLEEP"

23c5 ldx #$ed
23c7 ldy #$5c
23c9 jmp $23f7

; Drukuj tekst "GIMBAL HAS WOKEN UP"

23cc ldx #$1a
23ce ldy #$5d
23d0 jmp $23f7

; Drukuj tekst "GIMBAL HAS GONE AWAY"

23d3 ldx #$36
23d5 ldy #$5d
23d7 jmp $23f7

; Drukuj tekst "GIMBAL HAS TAKEN REFRESHMENT"

23da ldx #$80
23dc ldy #$5d
23de jmp $23f7

; Drukuj tekst "GIMBAL WILL TRY TO BE HAPPY"

23e1 ldx #$a2
23e3 ldy #$5d
23e5 jmp $23f7

; Poniej umieszczono pomocnicze procedury pomocne przy rysowaniu okienek
; Przed wywoaniem musz otrzyma w X i Y adres tekstu do wydrukowania.
; Procedury ustawiaj jedynie numer okienka.

23e8 lda #$02           Rysuj okienko nr. 02
23ea jmp $2401

23ed lda #$0d           Rysuj okienko nr. 0d
23ef jmp $2401

23f2 lda #$1c           Rysuj okienko nr $1c
23f4 jmp $2401

23f7 lda #$1d           Rysuj okienko nr $1d
23f9 jmp $2401

23fc lda #$23           Rysuj okienko nr $23
23fe jmp $2401

; Narysuj okienko o numerze podanym w A, wydrukuj w nim tekst (X, Y - modszy
; i starszy adres tekstu, pierwszy bajt - pozycja dolnej krawdzi okienka).
; Wydrukuj nastpnie okienko "PRESS FIRE TO CONTINUE" i poczekaj na fire.

2401 stx $d5            wstaw adres do $d5,6
2403 sty $d6
2405 pha                numer okienka na stos
2406 asl @              *2
2407 asl @              *4
2408 ldy #$00
240a sty $2425
240d asl @              *8
240e rol $2425
2411 clc
2412 adc #$ae           $4aae - pozycja dolnej krawdzi pierwszego okienka
2414 sta $2424
2417 lda $2425          dodaj do [2424], aby uzyska adres komrki
241a adc #$4a           przechowujcej t pozycj dla okienka wybranego
241c sta $2425
241f ldy #$00
2421 lda ($d5),y        Pierwszy znak tekstu wskazywanego przez [$d5] to
2423 sta irqmv+1        wysoko okienka. Wstaw j do tablicy danych okienka
2426 jsr $1589          Zwiksz o 1 $d5,6
2429 pla                we numer okienka ze stosu
242a jsr $1727          rysuj okienko
242d jsr $148f          drukuj tekst w okienku
2430 jsr $211c          Wydrukuj "Press fire to continue" i poczekaj na fire
2433 jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr

; Procedura wywietla okno z list postaci i pozwala na wybranie jednej.
; W X i Y zawiera adres tekstu dodatkowego, ktry ma si ukaza w okienku.
; Numer identyfikacyjny wybranej postaci zapisywany jest do komrki $0913.

2436 tya                Y na stos
2437 pha
2438 txa                X na stos
2439 pha
243a jsr $40ec          Efekt dwikowy nr. 3
243d pla                we X ze stosu
243e tax
243f pla                we Y ze stosu
2440 tay
2441 cpy #$00           jeeli Y = 0 -> $2453
2443 beq $2453          (nie jest otwierane okienko COMMAND)
2445 txa                X na stos
2446 pha
2447 tya                Y na stos
2448 pha
2449 jsr $2135          otwrz u dou ekranu okienko "COMMAND"
244c pla                we Y ze stosu
244d tay
244e pla                we X ze stosu
244f tax
2450 jsr $2197          drukuj tekst w okienku pomocniczym
2453 lda $090d          we numer pokoju, w ktrym znajduje si Magic Knight
2456 jsr $21c4          utwrz list postaci, ktre znajduj si w jego pokoju
2459 bne $2475          A zawiera liczb tych postaci. A > 0 -> $2475
245b lda $52e8          ustaw pozycj dolnej krawdzi okienka $0d na 3
245e sta $4b16
2461 lda #$0d           Rysuj okienko nr. $d
2463 jsr $1727
2466 ldx #$e9           drukuj "THERE IS NOBODY IN THIS ROOM"
2468 ldy #$52
246a jsr $148b
246d jsr $211c          Wydrukuj "Press fire to continue" i poczekaj na fire
2470 pla                zdejmij adres powrotu do procedury realizujcej polec.
2471 pla
2472 jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr
2475 clc                do liczby postaci w tej lokacji (w A) dodaj 4
2476 adc #$04
2478 sta $4ac6          zapisz to jako doln pozycj okienka o numerze $3
247b lda #$03           narysuj okienko ze strzak o numerze $03
247d jsr $171e
2480 ldx #$d7           drukuj "WHO DO YOU WANT TO"
2482 ldy #$52
2484 jsr $148b
2487 ldx $092b          pobierz do X i Y adres tekstu, ktry nastpnie
248a ldy $092c          wydrukuj w okienku gwnym
248d jsr $148b
2490 lda #$40           wpisz do tekstu, ktry za chwil ma si wydrukowa
2492 sta $4fbd          zmniejszony o 1 kod litery 'A' (pierwsza pozycja)
2495 lda #$64
2497 jsr $0dea          Przetwrz palet ($64) na kody poszczeglnych kolorw
249a ldx #$00           teraz bdziemy przeglda tablic z identyfikatorami
249c lda $220b,x        we identyfikator kolejnej postaci
249f cmp #$ff
24a1 beq $24c6          jeeli jest rwny $ff (postaci nie ma) -> $24c6
24a3 inc $4fbd          zwiksz o 1 kod pozycji (np. 'A' na 'B')
24a6 txa                licznik ptli przechowujemy na stosie
24a7 pha
24a8 ldx #$bc           drukuj znak nowego wiersza, kod pozycji i dwie spacje
24aa ldy #$4f
24ac jsr $148b
24af pla                pobieramy ze stosu licznik ptli
24b0 pha                ale zaraz go wstawiamy z powrotem na stos
24b1 tax                i do X
24b2 lda $220b,x        pobieramy identyfikator kolejnej postaci (<> $ff)
24b5 sta $0913          wstawiamy go do komrki pomocniczej
24b8 ldx #$3e           drukuj znak o kodzie $1e - pen nazw postaci o
24ba ldy #$22           kodzie podanym w $0913
24bc jsr $148b
24bf pla                pobieramy ze stosu indeks ptli
24c0 tax                przesyamy go do X
24c1 inx                zwikszamy go o 1
24c2 cpx #$03           czy doszlimy ju do koca tablicy identyfikatorw?
24c4 bne $249c          nie -> $249c
24c6 jsr $1af6          zwr w A identyfikator wybranej joystickiem pozycji
24c9 jsr $222a          zapisz w $0913 identyfikator tej postaci
24cc jsr $40c5          sprawd, czy nie wybrano GIMBALLA wtedy, gdy nie wolno
24cf rts

; Procedura rysuje okienko z nazwami postaci poprzedzone tekstem "WHO DO YOU
; WANT TO xxx", gdzie adres tekstu 'xxx' jest podany w X i Y. Procedura zwraca
; w komrce $0913 numer postaci (liczc od zera).

24d0 tya                Y na stos
24d1 pha
24d2 txa                X na stos
24d3 pha
24d4 jsr $40ec          Efekt dwikowy nr. 3
24d7 pla                we X ze stosu
24d8 tax
24d9 pla                we Y ze stosu
24da tay
24db lda $0915          sprawd, czy MK upuci ju GLOWING BOTTLE -
24de and #$01           czy jest BANSHEE (0 - nie, 1 - tak)
24e0 clc
24e1 adc #$0b           dodaj $0b, otrzymujc wysoko okienka z postaciami
24e3 sta $4ac6          bdzie to pozycja dolnej krawdzi okienka nr 3
24e6 txa                X na stos
24e7 pha
24e8 tya                Y na stos
24e9 pha
24ea lda #$03           narysuj okienko nr 3 (ze strzak)
24ec jsr $171e
24ef ldx #$d7           drukuj w otwartym oknie "WHO DO YOU WANT TO"
24f1 ldy #$52
24f3 jsr $148b
24f6 pla                we Y ze stosu
24f7 tay
24f8 pla                we X ze stosu
24f9 tax
24fa jsr $148b          dopisz tekst z nazw czynnoci
24fd lda #$64
24ff jsr $0dea          Przetwrz palet ($64) na kody poszczeglnych kolorw
2502 lda $0915          sprawd, czy MK upuci ju GLOWING BOTTLE -
2505 and #$01           czy jest BANSHEE (0 - nie, 1 - tak)
2507 clc                dodaj do tego $07
2508 adc #$07
250a sta $252c          bdzie to argument instrukcji CPY - ograniczenie ptli
250d ldx #$00           numer postaci od ktrej zaczynamy: 0
250f txa                numer postaci z X do A
2510 pha                i na stos
2511 sta $0913          z komrki $0913 korzysta procedura drukujce teksty
2514 clc                dodaj do tego $41 otrzymujc kod litery - identyfik.
2515 adc #$41
2517 sta $4fbd          zapisz go jako fragment tekstu drukowanego poniej
251a ldx #$bc           drukuj w otwartym okienku: <kod nowej linii><litera>
251c ldy #$4f           i dwie spacje
251e jsr $148b
2521 ldx #$3e           drukuj tekst bdcy znakiem $1e - pena nazwa postaci
2523 ldy #$22           o numerze podanym w komrce $0913
2525 jsr $148b
2528 pla                odtwrz X ze stosu - jest to nr postaci
2529 tax
252a inx                + 1
252b cpx #$00           argument tej instrukcji by ustawiony wczeniej
252d bne $250f          jeeli nie bya to ostatnia posta -> $250f
252f jsr $1af6          zwr w A identyfikator wybranej joystickiem pozycji
2532 sec                odejmij $41 - powstanie numer pozycji liczony od zera
2533 sbc #$41
2535 sta $0913          zapisz t liczb w komrce $0913 - numer postaci
2538 jsr $2234          wpisz w pomocn. okienku u dou nazw skrtow postaci
253b jsr $40c5          sprawd, czy nie wybrano GIMBALLA wtedy, gdy nie wolno
253e rts

; Przeskocz do pocztku nazwy przedmiotu o numerze w X
; wynik zostaw w $d5,6

253f lda #$5c
2541 ldy #$48           $485c - pocztek tablicy z nazwami przedmiotw

; Przeskocz do X-tego PStringu w tablicy o adresie pocztkowym podanym w A i Y
; wynik zostaw w $d5,6

2543 sta $d5
2545 sty $d6
2547 txa                jeli X = 0 (NOTHING AT ALL) to nie trzeba
2548 beq $2550          przeszukiwa tablicy
254a jsr $147f          przeskocz PString zapisany od adresu [$d5]
254d dex
254e bne $254a          czy znaleziono ju waciwy?
2550 rts

; Przeskocz do X-tego napisu bdcego opisem przedmiotu

2551 lda #$68           $5f68 - pocztek napisw bdcych opisami przedmiotw
2553 ldy #$5f						  wywietlanymi podczas ich czytania
2555 jmp $2543

; Przeskocz do X-tego podpolecenia dla polecenia "COMMAND A CHARACTER"
; (GO TO SLEEP, WAKE UP, GO AWAY, HELP, EAT & DRINK, BE HAPPY). Wynik zostaw w $d5,6

2558 lda #$77
255a ldy #$5c
255c jmp $2543

; Narysuj okienko z nazwami przedmiotw bez strzaki

255f lda #$6f           okienko z nazwami przedmiotw bdzie bez strzaki
2561 sta $25ae
2564 jmp $2596          rysuj okienko z nazwami przedmiotw

; Procedura rysuje na ekranie okienko z nazwami przedmiotw i tekstem, ktrego
; adres przekazano w $092b,c. Dodatkowo, jeeli Y <> 0, rysowane jest okienko
; "COMMAND" i wpisywany jest w nim tekst, ktrego adres podano w X i Y. W A
; zwracany jest identyfikator wybranej joystickiem pozycji.

2567 tya                Y i X na stos
2568 pha
2569 txa
256a pha
256b jsr $40e9          Efekt dwikowy nr. 2
256e pla                otwrz X i Y ze stosu
256f tax
2570 pla
2571 tay
2572 stx $d5            [$d5] - X - modszy bajt
2574 sty $d6            [$d6] - Y - starszy bajt
2576 ldy #$00           we pierwszy przedmiot
2578 lda ($e1),y
257a bne $257f          jeeli istnieje -> $257f
257c jmp $2604          nie istnieje -> komunikat o bdzie i wyskok
257f lda #$69           okienko, ktre si otworzy ma zawieta strzak
2581 sta $25ae          jest to argument lda
2584 lda $d6            we starszy bajt tekstu do wydrukowaniua w "COMMAND"
2586 beq $2596          jeeli zerowy -> $2596 (okienka "COMMAND nie bdzie)
2588 pha                modszy i starszy bajt tekstu (poprzedni zawarto
2589 lda $d5            X i Y wstaw na stos)
258b pha
258c jsr $2135          otwrz u dou ekranu okienko "COMMAND"
258f pla                odtwrz X i Y ze stosu
2590 tax
2591 pla
2592 tay
2593 jsr $2197          wpisz tekst do okienka (X, Y - adres tekstu)

2596 ldx #$00           X bdzie zawiera liczb niesionych przedmiotw
2598 ldy #$00           rozpocznij od pierwszego przedmiotu
259a lda ($e1),y        we go
259c beq $25a4          jeli nie istnieje -> $25a4
259e iny                zwiksz liczb istniejcych przedmiotw
259f inx
25a0 cpy #$05           czy sprawdzono ju wszystkie (5)
25a2 bne $259a          nie -> sprawd nastpne
25a4 txa                ile MK niesie przedmiotw?
25a5 beq $260f          jeli zero -> $260f (napisz "NOTHING AT ALL") i wysk.
25a7 clc                dodaj 3 do tej liczby, powstanie wysoko okienka
25a8 adc #$03
25aa sta $4ace          bdzie to pozycja dolnej krawdzi okienka nr 4
25ad lda #$00           argument lda jest ustawiony na $69 jeli ma by
25af cmp #$69           okienko ze strzak
25b1 bne $25bb          jeli bez strzaki -> $25bb
25b3 lda #$04           narysuj okienko nr 4 ze strzak
25b5 jsr $171e
25b8 jmp $25c0          przeskocz otwieranie okienka bez strzaki
25bb lda #$04           Rysuj okienko nr. 4
25bd jsr $1727
25c0 lda #$40           numeracja pozycji w okienku bdzie si zaczynaa od
25c2 sta $4fbd          'A' ($40 - 1)
25c5 ldx $092b          wydrukuj tekst poprzedzajcy nazwy przedmiotw,
25c8 ldy $092c          ktrego adres przekazano w $092b,c
25cb jsr $148b
25ce lda #$a4
25d0 jsr $0dea          Przetwrz palet ($a4) na kody poszczeglnych kolorw
25d3 ldy #$00           bdziemy teraz odczyt przedmiotw niesionych przez MK
25d5 tya                zapamitaj indeks ptli na stosie
25d6 pha
25d7 lda ($e1),y        we numer przedmiotu
25d9 beq $2600          koniec -> $2600
25db pha                numer przedmiotu na stos
25dc inc $4fbd          pozycja bdzie si zaczynaa od nastpnej litery
25df ldx #$bc           drukuj tekst: <numer_pozycji><spacja><spacja>
25e1 ldy #$4f
25e3 jsr $148b
25e6 pla                we numer przedmiotu ze stosu
25e7 tax                wpisz go do X
25e8 jsr $253f          Przeskocz do pocztku nazwy przedmiotu o numerze w X
25eb jsr $148f          wydrukuj jego nazw (adres nazwy w $d5,6)
25ee pla                we ze stosu indeks ptli
25ef tay                przelij go do Y i zwiksz o 1
25f0 iny
25f1 cpy #$05           czy przetworzylimy ju 5 (ostatni) pozycj
25f3 bne $25d5          nie -> $25d5
25f5 lda $25ae          we argument lda, ktry okrela, czy ma by strzaka
25f8 cmp #$69           jeeli miao by bez strzaki -> $25ff (rts)
25fa bne $25ff
25fc jsr $1af6          zwr w A identyfikator wybranej joystickiem pozycji
25ff rts

2600 pla                zdjcie ze stosu indeksu ptli
2601 jmp $25f5          wybierz pozycj lub wyjd, jeli nie ma strzaki

; Procedura okienko i wpisuje do niego, e MK nie niesie adnego przedmiotu,
; po czym koczy obsug polecenia

2604 pla                zdejmij ze stosu adres powrotu to procedury woajcej
2605 pla                ($2567)
2606 lda #$0d           bdzie rysowane okienko $0d
2608 ldx #$65           drukuj tekst: "YOU ARE NOT CARRYING ANYTHING"
260a ldy #$58
260c jmp $2401

; Procedura rysuje okienko nr 4 i wpisuje w nim tekst "NOTHING AT ALL"

260f lda #$04           ustaw pozycj dolnej krawdzi okienka nr 4 na 4
2611 sta $4ace
2614 jsr $1727          Rysuj okienko nr. 4
2617 ldx $092b          we do X i Y ustawiony wczeniej adres tekstu do wydr.
261a ldy $092c
261d jsr $148b          drukuj ten tekst w okienku
2620 ldx #$5c           drukuj "NOTHING AT ALL"
2622 ldy #$48
2624 jsr $148b
2627 rts

; Procedura oblicza w $e3,4 adres elementu w tablicy kolizji odpowiadajcego
; pozycji o wsprzdnych przekazanych w X i Y.

2628 lda #$00           zainicjuj na 0 modszy bajt adr., ktry utworzymy
262a sta $e3
262c tya                przelij do A wsprzdn Y wyraon kratkowo
262d lsr @              /8 - zap modsze bity przy dzieleniu w modszym
262e ror $e3                 bajcie adresu
2630 lsr @              (powstanie w A numer strony od pocztku tablicy
2631 ror $e3             przypisany danej wsprzdnej)
2633 lsr @
2634 ror $e3
2636 clc                dodaj do A $7d (numer strony od ktrej zaczyna si
2637 adc #$7d                           tablica)
2639 sta $e4            zapisz to jako starszy bajt adresu
263b txa                przelij do A wsprzdn X wyraon pikselami trybu 8
263c ora $e3            poniewa 3 modsze bity s zerami wic po 'ora' z m.
263e sta $e3            bajtem adresu otrzymamy m. bajt adresu odpow. pozycji
2640 rts

; Procedura animuje posta Magic Knighta. Przy rysowaniu wymagane jest podanie
; w komrkach $0445, $0446 wsprzdnych aktualnej pozycji MK w pikselach
; trybu gr. 8; w komrkach $0448, $0449 - wsprzdnych pozycji nowej.

; Wpisz do $eb,c adres miejsca w pamici ekranu, ktrego kada wsprzdna
; pikselowa bdzie mniejsz z dwch wsprzdnych (X lub Y) dla "starej" i
; "nowej" pozycji Magic Knighta. Do $0935 zapisywana jest kratkowa wsprzdna
; X MK "bardziej w lewo".

2641 ldx #$00           jest to domylna zawarto komrki $0936
2643 lda $0449          we now pozycj Y Magic Knighta
2646 cmp $0446          porwnaj ze aktualn pozycj Y
2649 beq $2652          jeeli nowa = stara -> $2652 (zapisz 0 do $0936)
264b bcc $2652          jeeli nowa < stara -> $2652 (zapisz 0 do $0936)
264d ldx #$01           do $0936 zapisz 1 jeli nowa Y > stara Y
264f lda $0446          we star pozycj Y Magic Knighta
2652 stx $0936          zapisz 1 do $0936 jeli nowa Y > stara Y lub 0 w p. p.
2655 lsr @              A =/ 2 (uwaga: A zawiera pozycj Y "bardziej do gry"
2656 ror $eb            zap bit przeniesienia w najstarszym bicie $eb
2658 lsr @              A =/ 2
2659 ror $eb            zap bit przeniesienia w najstarszym bicie $eb
265b lsr @              A =/ 2
265c ror $eb            zap bit przeniesienia w najstarszym bicie $eb
265e clc                dodaj do A $88, aby stanowio starszy bajt starej
265f adc #$88           pozycji Magic Knighta
2661 sta $ec            zapisz ten bajt w $ec
2663 lda $eb            we $eb, w ktrym ustawiono trzy najstarsze bity
2665 and #$e0           wykasuj bity pozostae
2667 sta $eb            i zapisz do $eb

2669 lda $0445          we aktualn pozycj X Magic Knighta
266c and #$f8           skasuj najm. 3 bity (powstanie nr kolumny w poz. * 8)
266e sta $2677          zapisujemy to jako argument cmp poniej
2671 lda $0448          we nastpn pozycj X Magic Knighta
2674 and #$f8           wykasuj w niej 3 najm. bity (uwaga jak wyej)
2676 cmp #$00           porwnaj z pozycj poprzedni z wykasowanymi bitami
2678 beq $267c          jeeli rwne -> $267c (nie istotne, ktr weniemy)
267a bcs $268c          jeeli nowa X > stara X -> $268c
267c lda $0448          we ponownie nastpn pozycj X Magic Knighta
267f lsr @              /8 (powstanie nr_kolumny w poz. * 8)
2680 lsr @
2681 lsr @
2682 sta $0935          zapisz kratkow wsp. X pozycji MK "bardziej w lewo"
2685 ora $eb            wykonaj 'ora' z przygotowanymi wczeniej bitami w $eb
2687 sta $eb            utworzy to ostatecznie adres $eb,c opisany powyej
2689 jmp $2692          przeskocz do miejsca oblicz. rnic midzy wsp. Y

268c lda $0445          we aktualn pozycj X Magic Knighta
268f jmp $267f          oblicz pozycj kratkow wsp. X i zapisz j w $0935

; Oblicz w $0931 rnic bezwzgldn midzy pikselowymi wsprzdnymi Y a w
; $0932 t sam rnic zwikszon o $31. Druga rnica bdzie liczb linii,
; ktre trzeba odrysowa, aby zmieni pozycj MK ze starej na now - 1
; (wysoko MK to 32 linie)

2692 lda $0936          we 1 jeli nowa wsp. Y MK > stara Y MK lub 0 w p. p.
2695 bne $26aa          jeli 1 (nowa Y > stara Y) -> $26aa (odejm. odwrotnie)
2697 lda $0446          we star wsprzdn Y Magic Knighta
269a sec                odejmij now wsprzdn Y
269b sbc $0449
269e sta $0931          zapisz rnic midzy wsprzdnymi Y Magic Knighta
26a1 clc                +31
26a2 adc #$1f
26a4 sta $0932          zapisz w $0932 rnic midzy wsprzdnymi Y MK + 31
26a7 jmp $26ba          przeskocz odwrotne odejmowanie

26aa lda $0449          we now wsprzdn Y Magic Knighta
26ad sec                odejmij star wsprzdn Y
26ae sbc $0446
26b1 sta $0931          zapisz rnic midzy wsprzdnymi Y Magic Knighta
26b4 clc                +31
26b5 adc #$1f
26b7 sta $0932          zapisz w $0932 rnic midzy wsprzdnymi Y MK + 31

; Zapisz w $e5,6 adres "nowej" bitmapy Magic Knighta. Do $0934 wpisz
; przesunicie kratkowe "nowej" pozycji X MK wobec pozycji o adresie
; wyliczonym w $eb,c. Do $092f wpisz liczb bitw, o jakie przesuwana jest
; "nowa" bitmapa w prawo wobec granicy bajtu.

26ba lda $0448          we nastpn pozycj X Magic Knighta
26bd lsr @              /8
26be lsr @
26bf lsr @
26c0 sec                odejmij wsprzdn X MK "bardziej w lewo"
26c1 sbc $0935          (powstanie 0 lub 1 - MK rusza si o 2 piksele trybu 8)
26c4 sta $0934          offs. poz. kratk. X MK wobec pozycji "bardziej w lewo"
26c7 lda $0448          we nastpn pozycj X Magic Knighta
26ca and #$07           we najmodsze 3 bity
26cc sta $092f          jest to liczba przes. w prawo dla nowej bitmapy MK * 2
26cf lda $044a          we akt. nr bitmapy wywietlanej podczas animacji MK
26d2 asl @              *2
26d3 tax                bdzie to indeks do tablicy adresw bitmap MK
26d4 lda $280d,x        odczytaj adres aktualnej bitmapy i zapisz go w $e5,6
26d7 sta $e5
26d9 lda $280e,x
26dc sta $e6

; Zapisz w $e7,8 adres "starej" bitmapy Magic Knighta. Do $0933 wpisz
; przesunicie kratkowe "starej" pozycji X MK wobec pozycji o adresie
; wyliczonym w $eb,c. Do $0930 wpisz liczb bitw, o jakie przesuwana jest
; "stara" bitmapa w prawo wobec granicy bajtu.

26de lda $0445          we aktualn pozycj X Magic Knighta
26e1 lsr @              /8
26e2 lsr @
26e3 lsr @
26e4 sec                odejmij wsprzdn X MK "bardziej w lewo"
26e5 sbc $0935
26e8 sta $0933          jest to liczba przes. w prawo dla starej bitm. MK * 2
26eb lda $0445          we akt. poz. X Magic Knigtha w pikselach trybu gr. 8
26ee and #$07           trzy ostatnie bity bd liczb pikseli o ktr naley
26f0 sta $0930          przesun mask w prawo * 2 - zapisujemy j do $0930
26f3 lda $0447          we nr poprzedniej bitmapy przypisanej MK
26f6 asl @              *2
26f7 tax                bdzie to indeks do tabeli adresw poszczeg. bitmap
26f8 lda $280d,x        zapisz w $e7,8 adres poprzedniej bitmapy
26fb sta $e7
26fd lda $280e,x
2700 sta $e8

; Jeeli trzeba, zamie miejscami w pamici dane "nowej" i "starej" pozycji
; Magic Knighta, tak, aby w komrkach $0934, $092f, $e5,6 znajdoway si dane
; pozycji "pierwszej od gry".

2702 lda $0936          we 1 jeli nowa wsp. Y > stara wsp. Y lub 0 w p. p.
2705 beq $2737          gdy nowa <= stara -> $2737 (nie zamieniaj danych poz.)
2707 lda $0934          offs. nowej poz. kratk. X MK wobec pozycji "na lewo"
270a pha
270b lda $0933          we przesunicie kratkowe "starej" pozycji MK
270e sta $0934          zamie je miejscami przy pomocy stosu
2711 pla
2712 sta $0933
2715 lda $092f          we liczb przesuni w prawo dla nowej bitmapy MK * 2
2718 pha
2719 lda $0930          we liczb przesuni w prawo dla starej bitm. MK * 2
271c sta $092f          zamie je miejscami
271f pla
2720 sta $0930
2723 lda $e5            zamie adres nowo przypisanej bitmapy ($e5,6) z
2725 pha                adresem bitmapy przypisanej poprzednio ($e7,8)
2726 lda $e6
2728 pha
2729 lda $e7
272b sta $e5
272d lda $e8
272f sta $e6
2731 pla
2732 sta $e8
2734 pla
2735 sta $e7

; Niech nowa pozycja Magic Knighta stanie si pozycj aktualn. Przygotuj si
; do rysowania.

2737 nop
2738 nop
2739 nop
273a lda $0448          we nastpn pozycj X Magic Knighta
273d sta $0445          bdzie to aktualna pozycja X MK
2740 lda $0449          we nastpn pozycj Y Magic Knighta
2743 sta $0446          bdzie to aktualna pozycja Y MK
2746 lda $044a          we akt. nr bitmapy wywietlanej podczas animacji MK
2749 sta $0447          bdzie to numer poprzedniej bitmapy przypisanej MK
274c lda #$4c           we nr linii ekranowej za g. polem gry * 2 (19 * 8)
274e cmp vcount         czy jest to aktualnie przetwarzana linia
2751 bne $274e          nie -> $274e (poczekaj)
2753 lda #$00           wyzeruj liczb przetworzonych linii ekranowych ($092e)
2755 sta $092e

; Wyzeruj w pamici cay obszar pamici pomocniczej wykorzystywanej podczas
; rysowania.

2758 ldy #$07
275a lda #$00
275c sta $2805,y
275f dey
2760 bpl $275c

; Jest to pocztek zasadniczej procedury rysujcej. Eor-uje ona pamic ekranu
; ze star i now bitmap Magic Knighta, korzystajc z wyliczonych offsetw.
; Przy rysowaniu zakadamy, e w komrkach $0934, $092f, $e5,6 znajduj si
; dane tej pozycji, dla ktrej rysowanie bitmapy ma by rozpoczte najpierw,
; jeeli rysujemy "od gry".

2762 lda $092e          we liczb przetworzonych linii ekranowych
2765 cmp #$1f           czy przetwarzana jest linia 31 (ostatnia pier. bitm.)?
2767 bcs $279f          tak -> $279f (dane pier. bit. w pam. pom. bd zerami)
2769 ldx $0934          offs. pierw. poz. kratk. X MK wobec pozycji "na lewo"
276c ldy #$00           bdziemy za chwil pobierali bajt pod zerowym indeksem
276e lda ($e5),y        we pierwszy bajt z kolejnej linii pierwszej bitmapy
2770 sta $2805,x        zapisz do pamici roboczej pod odpowiednim offsetem
2773 iny                zwiksz indeks o 1
2774 lda ($e5),y        we drugi bajt z kolejnej linii pierwszej bitmapy
2776 sta $2806,x        zapisz do pamici roboczem pod poprzednim offsetem + 1
2779 lda $e5            zwiksz $e5 o 2, aby $e5,6 wskazywao na pocztek
277b clc                kolejnej linii pierwszej bitmapy (nie zwikszamy $e6,
277c adc #$02           gdy bitmapy uoono w pamici tak, by kada miecia
277e sta $e5            si na jednej stronie)
2780 lda $092f          we licz. przesuni w prawo dla pierw. bitmapy MK * 2
2783 lsr @              /2
2784 tay                przelij t liczb do Y - bdzie to indeks ptli
2785 beq $279f          jeeli nie ma przesuwania -> $279f (przeskok przesuw.)
2787 ldx $0934          offs. pierw. poz. kratk. X MK wobec pozycji "na lewo"
278a lsr $2805,x        teraz przesu w prawo poszczeglne bity bitmapy (pod
278d ror $2806,x        odpowiednim indeksem) o odpowiedni liczb miejsc.
2790 ror $2807,x        Cao powtrz, gdy 1 piksel to 2 bity.
2793 lsr $2805,x
2796 ror $2806,x
2799 ror $2807,x
279c dey                zmniejsz o 1 liczb przesuni o prawo
279d bne $278a          jeeli wiksza od zera -> $278a (przesuwaj dalej)
279f lda $092e          we nr aktualnej linii ekranowej
27a2 cmp $0931          porwnaj z rnic midzy wsprzdnymi Y MK
27a5 bcc $27e3          gdy nr lin. < r. -> $27e3 (przesk. odcz. drug. poz.)
27a7 cmp $0932          porwnaj z rnic midzy wsprzdnymi Y MK + 31
27aa bcc $27ad          jeeli mniejsza (C = 0) -> $27aa (rysuj drug bitmap)
27ac rts                koniec - zmieniono pozycj Magic Knighta na ekranie

; Procedura przygotowuje w pamici pomocniczej dane drugiej bitmapy
; (analogicznie jak wyej).

27ad ldx $0933          we liczb przesun. w prawo dla drugiej bitmapy MK * 2
27b0 ldy #$00           zainicjuj na 0 indeks do danych drugiej bitmapy
27b2 lda ($e7),y        we pierwszy bajt z kolejnej linii drugiej bitmapy
27b4 sta $2809,x        zapisz do pamici pomocniczej pod odpowienim offsetem
27b7 iny                zwiksz o 1 indeks do danych drugiej bitmapy
27b8 lda ($e7),y        we drugi bajt z kolejnej linii drugiej bitmapy
27ba sta $280a,x        zapisz do pamici roboczem pod poprzednim offsetem + 1
27bd lda $e7            zwiksz $e5 o 2, aby $e5,6 wskazywao na pocztek
27bf clc                kolejnej linii drugiej bitmapy (nie zwikszamy $e8,
27c0 adc #$02           gdy bitmapy uoono w pamici tak, by kada miecia
27c2 sta $e7            si na jednej stronie)
27c4 lda $0930          we liczb przesuni w prawo dla drugiej bitm. MK * 2
27c7 lsr @              /2
27c8 tay                bdzie to liczba obiegw ptli przesuwajcej bity
27c9 beq $27e3          jeeli zerowa -> $27e3 (przeskocz przesuwanie)
27cb ldx $0933          we liczb przesun. w prawo dla drugiej bitmapy MK * 2
27ce lsr $2809,x        teraz przesu w prawo poszczeglne bity bitmapy (pod
27d1 ror $280a,x        odpowiednim indeksem) o odpowiedni liczb miejsc.
27d4 ror $280b,x        Cao powtrz, gdy 1 piksel to 2 bity.
27d7 lsr $2809,x
27da ror $280a,x
27dd ror $280b,x
27e0 dey                zmniejsz o 1 licznik ptli przesuwajcej bity
27e1 bne $27ce          jeeli niezerowy -> $27ce (przesuwaj dalej)

; Wykonaj eorowanie pamici ekranu z pamici pomocnicz dla pierwszej i
; drugiej bitmapy.

27e3 ldy #$00           ustaw na 0 licznik ptli obiegajcej 1 lini bitmapy
27e5 lda $2805,y        we przygotowany wczeniej bajt pierwszej bitmapy
27e8 eor $2809,y        wykonaj eorowanie z bajtem drugiej bitmapy
27eb eor ($eb),y        wykonaj eor na pamici ekranu
27ed sta ($eb),y        zapisz bajt z przygot. fragm. bitmapy w pamici ekranu
27ef iny                zwiksz o 1 licznik ptli dla 1 linii bitmapy
27f0 cpy #$04           czy doszlimy do 4 (4 bajty dla jednej bitmapy)?
27f2 bne $27e5          nie -> $27e5 (kontynuacja ptli rysujcej lini)
27f4 inc $092e          zwiksz o 1 liczb przetworzonych linii ekranowych
27f7 lda $eb            zwiksz $eb,c o $20, tak, by wskazywao na bajt w
27f9 clc                pamici ekranu odpowiadajcy nastpnej linii
27fa adc #$20
27fc sta $eb
27fe bcc $2802          (jeeli nie ma zwikszania starszego bajtu ->
2800 inc $ec            przeskok do jmp poniej)
2802 jmp $2758          skok na pocztek ptli rysujcej poszczeglne linie

; Pami pomocnicza wykorzystywana podczas kadej linii postaci Magic Knighta.
; Dla kadej (starej lub nowej) bitmapy s cztery bajty - MK moe by
; przesunity kratkowo o 1 pozycj w poziomie (bo rusza si o 1 piksel),
; jego bitmapa o szerokoci 8 pikseli moe po przesuniciu w prawo zajmowa
; maksymalnie 3 bajty.

2805 dta 0, 0, 0, 0     dane bitmapy dla pozycji "bardzej u gry"
2809 dta 0, 0, 0, 0     dane bitmapy dla pozycji "bardziej u dou"

; Tablica zawierajca adresy bitmap odpowiadajcych poszczeglnym fazom
; animacji Magic Knighta.
; Uwaga! pierwsza bitmapa jest pusta i moe suy do wskazania jako
; przypisana poprzedniej pozycji MK. Przy ustawieniu starej i nowej pozycji na
; to samo miejsce na ekranie, jedno eorowanie wykonywane przez procedur
; powyej bdzie nopem, co pozwoli na wywietlenie postaci MK w zadanym
; miejscu jeeli jej wczeniej nie byo na ekranie.

280d dta a($7fc0), a($8000), a($8040), a($8080), a($80c0), a($8100), a($8140)
281b dta a($8180), a($81c0)

; Procedura ustala nr bitmapy przypisanej Magic Knightowi

281f lda #$05           zapisz argument lda jako argument adc (poniej)
2821 sta $282c          (uwaga: argument lda te moe by ustawiony!)
2824 lda $0445          we aktualn pozycj X Magic Knighta
2827 lsr @              /2
2828 and #$03           we dwa najmodsze bity
282a clc                dodaj 5 (argument adc zosta ustawiony wczeniej)
282b adc #$00
282d sta $044a          zapisz A jako akt. nr bitm. wywietl. podczas anim. MK
2830 rts

; Procedura sprawdza, czy MK moe poruszy si w prawo o 1 piksel.
; C = 0 -> tak; C = 1 -> nie.

2831 lda $0445          we aktualn pozycj X Magic Knighta
2834 clc                +16 (bdzie to wsp. X pozycji bezporednio za MK)
2835 adc #$10
2837 lsr @              /8 (we wsprzdn kratkowa)
2838 lsr @
2839 lsr @
283a tax                zapamitaj otrzymany nr kratki w X
283b lda $0446          we aktualn pozycj Y MK w pikselach trybu gr. 8
283e sec                -1, bo zawsze pozycja Y MK zawiera wielokrotno
283f sbc #$01           pozycji kratkowej * 8 + 1
2841 pha                na stos
2842 lsr @              /8 (we t wsprzdn kratkowo)
2843 lsr @
2844 lsr @
2845 tay
2846 jsr $2628          Oblicz w e3,4 adres elem. z tabl. kolizji dla pozycji
2849 pla                we wsprzdn Y MK - 1 ze stosu
284a and #$f8           wyodrbnij najmodsze 3 bity
284c bne $2851          jeli <> 0 -> $2851 (MK zajmuje 4 kratki w pionie)
284e lda #$60           MK zajmuje $60 / $20 (bajt. w linii ekranu) = 3 kratki
2850 bit $80a9          jest to 'lda #$80' od $2851 ($80 / $20 = 4 kratki)
2853 sta $2863          zapisz A jako argument instrukcji cpy poniej
2856 ldy #$00           bdziemy trzyma indeks do tablicy kolizji w rej.  Y
2858 jsr $2871          sprawd kolizj "z boku" na podstawie tablicy kolizji
285b bcs $2867          jest kolizja -> $2867 (zwr 1 w C)
285d tya                indeks do tablicy kolizji do A
285e clc                +$20 (powstanie indeks do kratki dla pozycji poniej)
285f adc #$20
2861 tay                do Y
2862 cpy #$00           czy sprawdzono ju tyle ile miao by spr. (arg. ust.)
2864 bne $2858          nie -> $2858 (sprawdzaj dalej)
2866 clc                skasuj C (nie napotkano kolizji)
2867 rts

; Procedura sprawdza, czy Magic Knight moe poruszy si w lewo o 1 piksel.
; C = 0 -> tak; C = 1 -> nie.

2868 lda $0445          we aktualn poz. X Magic Knighta w piks. trybu gr. 8
286b sec                -2 (w A bdzie wsp. X pozycji bezporednio przed MK)
286c sbc #$02
286e jmp $2837          skok do rodka proc. badajcej moliwoc ruchu w prawo

;

2871 lda ($e3),y        we element z tablicy kolizji
2873 and #$20           sprawd bit nr 5
2875 bne $2879          jeli <> 0 -> $2879 (jest kolizja)
2877 clc                C = 0 oznacza brak kolizji
2878 bit bufrfl         jest to sec od $2879 (jest kolizja)
287a rts                zwr takie C, jakie ustawiono

; Sprbuj wykona ruch Magic Knighta w prawo o 1 piksel. C = 1 -> nie udao
; si (jest przeszkoda); C = 0 -> udao si.

287b jsr $2831          sprawd moliwo ruchu MK w prawo o 1 piksel
287e bcs $2894          jeli jest koliz. "z boku" -> $2894 (nie zmien. poz.)
2880 lda $0445          we aktualn pozycj X MK w pikselach trybu gr. 8
2883 clc                +2
2884 adc #$02
2886 sta $0448          bdzie to nastpna pozycja X Magic Knighta
2889 lda $0446          we aktualn pozycj Y MK w pikselach trybu gr. 8
288c sta $0449          bdzie to nastpna pozycja Y Magic Knighta
288f lda #$01           ustaw pocztkowy nr bitmapy MK skierowanego w prawo
2891 sta $2820
2894 rts

; Sprbuj wykona ruch Magic Knighta w lewo o 1 piksel. C = 1 -> nie udao si
; (jest przeszkoda); C = 0 -> udao si.

2895 jsr $2868          sprawd moliwo ruchu MK w lewo o 1 piksel
2898 bcs $2894          jest kolizja (nie ma moliwoci ruchu) -> $2894 (rts)
289a lda $0445          we aktualn pozycj X MK w pikselach trybu gr. 8
289d sec                -2
289e sbc #$02
28a0 sta $0448          bdzie to nastpna pozycja X Magic Knighta
28a3 lda $0446          we aktualn pozycj Y MK w pikselach trybu gr. 8
28a6 sta $0449          bdzie to nastpna pozycja Y Magic Knighta
28a9 lda #$05           we do A nr pocztkowy bitmapy MK skierowanego w lewo
28ab jmp $2891          ustal ten numer korzystc z fragm. procedury powyej

28ae lda $0445          we aktualn poz. X MK w pikselach trybu gr. 8
28b1 cmp #$f0           czy jest rwna $f0 (MK doszed do prawej kraw. lok.)
28b3 beq $28ba          tak -> $28ba (przejd do nastpnej lokacji)
28b5 cmp #$00           czy jest rwna $00 (MK doszed do lewej krawdzi lok.)
28b7 beq $28d7          tak -> $28d7 (przejd do poprzedniej lokacji)
28b9 rts
28ba ldy #$02           Y bdzie zawierao pozycj X MK po zmianie lokacji
28bc lda $090d          we nr lokacji Magic Knighta
28bf asl @              *2
28c0 tax                bdzie to indeks to tablicy pocze midzy lokacjami
28c1 inx                interesuje nas drugi bajt danej lok. (wyjcie w prawo)
28c2 lda $4a37,x        pobierz nr lokacji bdcej lokacj nastpn
28c5 cmp #$ff           czy jest to $ff (brak lokacji)?
28c7 bne $28ca          nie -> $28ca
28c9 rts                powrt - nie rysujemy nic
28ca sty $0445          zapisz Y jako aktualn poz. X Magic Knighta
28cd sty $0448          i pozycj nastpn
28d0 jsr $1310          Narysuj lokacj o numerze w A
28d3 jsr $1ce9          Ustal, jaki skad powinno mie menu
28d6 rts
28d7 ldy #$ee           Y bdzie zawierao pozycj X MK po zmianie lokacji
28d9 lda $090d          we nr lokacji Magic Knighta
28dc asl @              *2
28dd tax                bdzie to indeks to tablicy pocze midzy lokacjami
28de jmp $28c2          dalej wykonuj to samo co dla wyjcia w prawo

; Sprawd, czy opadajc, MK moe znale si na pozycji podanej w X i Y

28e1 dey                pozycja Y - 1 (bo zawiera ona zawsze wielokr. 8 + 1)
28e2 tya                do A - bdziemy dzieli
28e3 lsr @              /8 - uzyskaj nr kratki dla wsp. Y
28e4 lsr @
28e5 lsr @
28e6 tay                do Y
28e7 txa                wsprzdna pikselowa X do A
28e8 pha                zapamitaj j na stosie
28e9 lsr @              /8 - uzyskaj nr kratki X
28ea lsr @
28eb lsr @
28ec tax                do X
28ed jsr $2628          Oblicz w e3,4 adres elem. z tabl. kolizji dla pozycji
28f0 pla                we ze stosu wsprzdn pikselow X
28f1 and #$07           we najmodsze 3 bity wsprzdnej pikselowej X
28f3 bne $28f8          jeli <> 0 -> $28f8 (MK zajmuje 3 kratki w poziomie)
28f5 lda #$02           badamy kolizje w 2 kratkach poziomych liczc od MK
28f7 bit $03a9          jest to 'lda #3' (3 kratki poziome) od adresu $28f8
28fa sta $2906          zapisz A jako argument instrukcji cpy poniej
28fd ldy #$00           bdziemy liczy kratki poziome w rejestrze Y
28ff jsr $290d          sprawd kolizj "od gry" na podstawie tablicy kolizji
2902 bcs $290b          jest kolizja -> $290b (zwr 1 w C)
2904 iny                nastpna kratka pozioma
2905 cpy #$00           czy sprawdzono ju tyle ile miao by spr. (arg. ust.)
2907 bne $28ff          nie -> $28ff (sprawdzaj dalej)
2909 clc                skasuj C (nie napotkano kolizji)
290a bit $38            jest to sec od $290b (jest kolizja)
290c rts                zwr takie C, jakie ustawiono

; Procedura zwraca C = 1, jeeli element tablicy kolizji, na ktry wskazuje
; wektor $e3,4 nie wskazuje na kolizj "od gry" (np. z murkiem). W przeciwnym
; wypadku zwracane jest C = 0.

290d lda ($e3),y        we element z tablicy kolizji
290f and #$80           sprawd ostatni bit
2911 bne $2915          jeli <> 0 -> $2915 (jest kolizja)
2913 clc                C = 0 oznacza brak kolizji
2914 bit $38            jest to sec od $2915 (jest kolizja)
2916 rts                zwr takie C, jakie ustawiono

; Procedura obsuguje opadanie Magic Knighta z wysokoci. C = 1 -> nie
; zmieniono pozycji MK; C = 0 -> pozycj zmieniono.

2917 ldx $0445          we aktualn pozycj X MK w pikselach trybu gr. 8
291a lda $0446          we aktualn pozycj Y MK w pikselach trybu gr. 8
291d clc                obliczamy pozycj bezporednio pod MK
291e adc #$20           (32 piksele od jego gry)
2920 tay                bdzie to argument dla procedury wywoywanej poniej
2921 jsr $28e1          sprawd, czy wystpuje kolizja podczas opadania
2924 bcs $2936          jest kolizja -> $2936 (caa procedura zwraca C = 1)
2926 lda $0446          we aktualn pozycj Y MK w pikselach trybu gr. 8
2929 clc                zmie pozycj Y MK o 1 kratk w pionie
292a adc #$08
292c sta $0449          bdzie to nastpna pozycja Y Magic Knighta
292f lda $0445          we aktualn pozycj X MK w pikselach trybu gr. 8
2932 sta $0448          bdzie to nastpna pozycja X Magic Knighta
2935 clc                zwr C = 0 (brak kolizji)
2936 rts

; Procedura obsuguje skok Magic Knighta, jeeli jest on ju rozpoczty lub
; sprawdza, czy Magic Knight prbuje skoczy. C = 1 -> nie udao si ustali
; nowej pozycji MK dla skoku; C = 0 -> udao si.

2937 ldx $0938          we do X nr fazy animacji przy skoku Magic Knighta
293a bne $294f          jeeli <> 0 -> $294f (skok do fragmentu dla skoku)
293c lda $091c          We odczytany stan joysticka
293f and #$01           sprawd, czy joystick jest wychylony w gr
2941 beq $2945          przeskocz wyjcie z proc. (do waciwej obs. skokw)
2943 sec                ustaw C na 1 (nie udao si ustali nowej pozycji MK)
2944 rts

2945 lda $091c          We odczytany stan joysticka
2948 and #$0c           wyodrbnij bity wychylenia w prawo i lewo (2 i 3)
294a lsr @              /4 - bd to teraz bity 0 (lewo) i 1 (prawo)
294b lsr @
294c sta $0939          zapamitaj wych. w prawo (bit 1) i lewo (bit 0) joyst.

; Tutaj zaczyna si fragment, ktry sprawdza, czy Magic Knight jest w trakcie
; skoku. Jeeli tak, ustalane s (w $0448 i $0449) wsprzdne nowej pozycji.
; Procedura zwraca C = 0, jeeli udao si ustali kolejn pozycj MK w
; trakcie skoku i C = 1 w przeciwnym przypadku.

294f ldx $0938          we do X nr fazy animacji przy skoku Magic Knighta
2952 cpx #$1c           czy przekroczono liczb faz animacji dla skoku ($1c)?
2954 bcc $295d          nie -> $295d (przeskocz anulowanie skoku)
2956 lda #$00           ustaw na 0 nr fazy animacji przy skoku Magic Knighta
2958 sta $0938          (MK nie jest w trakcie skoku)
295b sec                ustaw C, nie udao si ustali nastpnej pozycji MK
295c rts

295d cpx #$0e           czy przekroczono liczb faz animacji dla ruchu w gr?
295f bcc $2964          nie -> $2964 (przeskocz instrukcj poniej)
2961 jmp $29fb          skok do fragmentu obsugujcego opadanie MK
2964 lda $0939          we zawart. kom. z wychchyleniem joyst. w prawo i lewo
2967 cmp #$03           czy joystick nie by wychylony ani w lewo ani w prawo?
2969 beq $29e3          tak -> $29e3 (ustal poz. MK dla skoku w gr)
296b cmp #$02           czy joystick by wychylony w lewo?
296d beq $29bd          tak -> $29bd (ustal poz. MK dla skoku w gr i w lewo)

; Fragment, ktry wylicza nastpn pozycj Magic Knighta w przypadku, kiedy
; skacze on w gr i w prawo. C = 1 -> ustalono pozycj; C = 0 -> nie
; ustalono.

296f ldx $0938          we do X nr fazy animacji przy skoku Magic Knighta
2972 lda $0446          we aktualn pozycj Y MK w pikselach trybu gr. 8
2975 sec                odejmij od niej modyfikator pozycji Y podczas skoku
2976 sbc $2b02,x
2979 tay                do Y
297a dey                -1, bo wsp. Y MK zawiera wielokrotno 8 + 1
297b lda $0445          we aktualn pozycj X MK w pikselach trybu gr. 8
297e clc                +2 (MK porusza si ruchem jednostajnym w prawo -
297f adc #$02               o jeden piksel)
2981 tax                bdzie to parametr dla procedury
2982 jsr $2a9c          spr. wsk. kolizji "od gry" dla kratek MK w poziomie
2985 bcc $2996          kolizji nie ma -> $2996 (kontynuacja)

; Fragment oblicza numer fazy skoku dla przerwanego skoku MK z powodu kolizji
; a nastpnie powtarza ca procedur skoku.

2987 lda #$0e           oblicz, ile faz animacji (wcznie z biec o numerze
2989 sec                w $0938, ktra nie zostaa narysowana) zostao jeszcze
298a sbc $0938          dla ruchu MK w gr
298d clc                po dodaniu $e powstanie nr pierwszej fazy animacji MK
298e adc #$0e           dla ruchu w d, ktra bdzie odpowiedni kontunuacj
2990 sta $0938          bdzie to nr fazy animacji przy skoku Magic Knighta
2993 jmp $294f          na pocztek procedury obsugujcej skok MK

2996 txa                do pozycji X MK dodaj $e (7 pikseli), aby sprawdzi
2997 clc                kolizj "z boku"
2998 adc #$0e
299a tax                bdzie to parametr dla procedury wywoywanej poniej
299b jsr $2ace          spr. wsk. kolizji "z boku" dla kratek MK w pionie
299e bcc $29a8          nie ma kolizji -> $29a8 (kontynuuj skok)

29a0 lda #$03           zapamitaj w komrce pomocniczej, e joystick nie by
29a2 sta $0939          wychylony ani w prawo ani w lewo
29a5 jmp $29e3          skok do fragm. ustalajcego poz. MK dla skoku do gry

29a8 lda #$01           ustaw pocztkowy nr bitmapy MK skierowanego w prawo
29aa sta $2820
29ad txa                odejmij $e od pozycji X MK, przywracajc pozycj X
29ae sec                po dodaniu 1 piksela
29af sbc #$0e

29b1 sta $0448          bdzie to nastpna pozycja X w pikselach trybu gr. 8
29b4 iny                + 1, aby w pozycja Y zawieraa wielokr. 8 + 1
29b5 sty $0449          bdzie to nastpna pozycja Y Magic Knighta
29b8 inc $0938          zwiksz na fazy animacji skoku Magic Knighta o 1
29bb clc                C = 0 (nie wykryto kolizji)
29bc rts

; Fragment, ktry wylicza nastpn pozycj Magic Knighta w przypadku, kiedy
; skacze on w gr i w lewo. C = 0 -> ustalono pozycj; C = 1 -> nie ustalono.

29bd ldx $0938          we do X nr fazy animacji przy skoku Magic Knighta
29c0 lda $0446          we aktualn pozycj Y MK w pikselach trybu gr. 8
29c3 sec                odejmij od niej modyfikator pozycji Y podczas skoku
29c4 sbc $2b02,x
29c7 tay                do Y
29c8 dey                -1, bo wsp. Y MK zawiera wielokrotno 8 + 1
29c9 lda $0445          we aktualn pozycj X MK w pikselach trybu gr. 8
29cc sec                -2 (MK porusza si ruchem jednostajnym w lewo -
29cd sbc #$02               o jeden piksel)
29cf tax                bdzie to parametr dla procedury
29d0 jsr $2a9c          spr. wsk. kolizji "od gry" dla kratek MK w poziomie
29d3 bcs $2987          kolizja -> $2987 (przerwij skok MK w gr)
29d5 jsr $2ace          spr. wsk. kolizji "z boku" dla kratek MK w pionie
29d8 bcs $29a0          kolizja -> $29a0 (ustaw, e MK bdzie skaka do gry)
29da lda #$05           ustaw pocztkowy nr bitmapy MK skierowanego w lewo
29dc sta $2820
29df txa                niezmieniona wsp. X bdzie param. procedury poniej
29e0 jmp $29b1          ustaw pozycje X i Y MK i wr

; Fragment, ktry wylicza nastpn pozycj Magic Knighta w przypadku, kiedy
; skacze on jedynie do gry. C = 0 -> ustalono pozycj; C = 1 -> nie ustalono.

29e3 ldx $0938          we do X nr fazy animacji przy skoku Magic Knighta
29e6 lda $0446          we aktualn pozycj Y MK w pikselach trybu gr. 8
29e9 sec                odejmij od niej modyfikator pozycji Y podczas skoku
29ea sbc $2b02,x
29ed tay                do Y
29ee dey                -1, bo wsp. Y MK zawiera wielokrotno 8 + 1
29ef ldx $0445          we do X aktualn pozycj X MK w pikselach trybu gr. 8
29f2 jsr $2a9c          spr. wsk. kolizji "od gry" dla kratek MK w poziomie
29f5 bcs $2987          C = 1 -> $2987 (kolizja -> przerwij skok MK w gr)
29f7 txa                niezmieniona wsp. X bdzie param. procedury poniej
29f8 jmp $29b1          ustaw pozycje X i Y MK i wr

; Fragment obsuguje opadanie MK po skoku. C = 1 -> nie udao si ustali
; nastpnej pozycji MK; C = 0 -> udao si ustali.

29fb lda $0939          we zawart. kom. z wychchyleniem joyst. w prawo i lewo
29fe cmp #$02           czy joystick by wychylony w lewo?
2a00 beq $2a35          tak -> $2a35 (ustal poz. MK dla skoku w d i w lewo)
2a02 cmp #$01           czy joystick by wychylony w prawo?
2a04 beq $2a6d          tak -> $2a6d (ustal poz. MK dla skoku w d i w prawo)
2a06 ldx $0938          we do X nr fazy animacji przy skoku Magic Knighta
2a09 lda $0446          we aktualn pozycj Y MK w pikselach trybu gr. 8
2a0c sec                odejmij od niej modyfikator pozycji Y podczas skoku
2a0d sbc $2b02,x
2a10 clc                dodaj do A wysoko MK (32 linie) uzyskujc nr linii
2a11 adc #$20           bezporednio pod MK po skoku
2a13 tay                do Y
2a14 dey                -1, bo wsp. Y MK zawiera wielokrotno 8 + 1
2a15 ldx $0445          we do X aktualn pozycj X MK w pikselach trybu gr. 8
2a18 jsr $2a9c          spr. wsk. kolizji "od gry" dla kratek MK w poziomie
2a1b bcc $2a64          brak kol. -> odejmij wys. MK, zapisz jego wsp. i wr

2a1d lda $0446          we aktualn pozycj Y MK w pikselach trybu gr. 8
2a20 sec                zaokrglij j w d do wielokrotnoci 8 + 1
2a21 sbc #$02
2a23 and #$f8
2a25 clc
2a26 adc #$09
2a28 sta $0449          bdzie to nastpna pozycja Y Magic Knighta
2a2b stx $0448          bdzie to nastpna pozycja X w pikselach trybu gr. 8
2a2e lda #$00           ustaw na 0 nr fazy animacji skoku Magic Knighta
2a30 sta $0938          (MK nie jest w trakcie skoku)
2a33 clc                ustaw C na 0 (udao si ustali nastpn pozycj MK)
2a34 rts

; Fragment, ktry wylicza nastpn pozycj Magic Knighta w przypadku, kiedy
; skacze on d i w lewo. C = 0 -> ustalono pozycj; C = 1 -> nie ustalono.

2a35 ldx $0938          we do X nr fazy animacji przy skoku Magic Knighta
2a38 lda $0446          we aktualn pozycj Y MK w pikselach trybu gr. 8
2a3b sec                odejmij od niej modyfikator pozycji Y podczas skoku
2a3c sbc $2b02,x
2a3f tay                do Y
2a40 dey                -1, bo wsp. Y MK zawiera wielokrotno 8 + 1
2a41 lda $0445          we do X aktualn pozycj X MK w pikselach trybu gr. 8
2a44 sec                -2
2a45 sbc #$02
2a47 tax                bdzie to parametr dla procedury wywoywanej poniej
2a48 jsr $2ace          spr. wsk. kolizji "z boku" dla kratek MK w pionie
2a4b bcc $2a55          nie byo kolizji -> $2a55 (przeskok, kontynuacja)
2a4d lda #$03           zapamitaj w komrce pomocniczej, e joystick nie by
2a4f sta $0939          wychylony ani w prawo ani w lewo
2a52 jmp $29fb          skok do fragmentu obsugujcego opadanie MK

2a55 tya                dodaj do Y wysoko MK (32 linie) uzyskujc nr linii
2a56 clc                bezporednio pod MK po skoku
2a57 adc #$20
2a59 tay                bdzie to parametr dla procedury
2a5a jsr $2a9c          spr. wsk. kolizji "od gry" dla kratek MK w poziomie
2a5d bcs $2a1d          jest kolizja -> $2a1d (MK koczy skok)
2a5f lda #$05           ustaw pocztkowy nr bitmapy MK skierowanego w lewo
2a61 sta $2820
2a64 tya                odejmij z powrotem wysoko MK uzyskujc now
2a65 sec                pozycj MK po skoku
2a66 sbc #$20
2a68 tay                wsprzdna Y zapisana w Y bdzie parametrem dla proc.
2a69 txa                wsprzdna X zapisana w A bdzie parametrem dla proc.
2a6a jmp $29b1          ustaw pozycje X i Y MK i wr

; Fragment, ktry wylicza nastpn pozycj Magic Knighta w przypadku, kiedy
; skacze on w d i w prawo. C = 0 -> ustalono pozycj; C = 1 -> nie ustalono.

2a6d ldx $0938          we do X nr fazy animacji przy skoku Magic Knighta
2a70 lda $0446          we aktualn pozycj Y MK w pikselach trybu gr. 8
2a73 sec                odejmij od niej modyfikator pozycji Y podczas skoku
2a74 sbc $2b02,x
2a77 tay                do Y
2a78 dey                -1, bo wsp. Y MK zawiera wielokrotno 8 + 1
2a79 lda $0445          we aktualn pozycj X MK w pikselach trybu gr. 8
2a7c clc                +16 (bdziemy sprawdza kratk bezporednio przed MK
2a7d adc #$10
2a7f tax                bdzie to parametr dla procedury wywoywanej poniej
2a80 jsr $2ace          spr. wsk. kolizji "z boku" dla kratek MK w pionie
2a83 bcs $2a4d          wystpuje kolizja -> $2a4d (MK bdzie opada)
2a85 tya                dodaj do Y wysoko MK (32 linie) uzyskujc nr linii
2a86 clc                bezporednio pod MK po skoku
2a87 adc #$20
2a89 tay
2a8a txa                od pozycji X MK odejmij $e (7 pikseli), aby sprawdzi
2a8b sec                kolizj z "gry"
2a8c sbc #$0e
2a8e tax                bdzie to parametr dla procedury
2a8f jsr $2a9c          spr. wsk. kolizji "od gry" dla kratek MK w poziomie
2a92 bcs $2a1d          jest kolizja -> $2a1d (MK koczy skok)
2a94 lda #$01           ustaw pocztkowy nr bitmapy MK skierowanego w prawo
2a96 sta $2820
2a99 jmp $2a64          odejmij wysoko MK, zapisz jego wsp. i wr

; Procedura sprawdza wskaniki kolizji "od gry" (np. z murkiem) w dwch lub
; trzech kratkach w poziomie (w zalenoci od tego, ile z nich zajmuje MK) dla
; pozycji pikselowej Magic Knighta przekazanej w X i Y. Jeeli wykryto
; kolizj, zwracane jest C = 1 lub C = 0 w przeciwnym przypadku.

2a9c tya                Y na stos
2a9d pha
2a9e txa                X na stos
2a9f pha
2aa0 lsr @              /8 - przekszta posta pikselow na kratkow
2aa1 lsr @
2aa2 lsr @
2aa3 tax                do X
2aa4 tya                bdziemy teraz przetwarza wsp. pikselow Y
2aa5 lsr @              /8 - przekszta j na posta kratkow
2aa6 lsr @
2aa7 lsr @
2aa8 tay                do Y
2aa9 jsr $2628          Oblicz w e3,4 adres elem. z tabl. kolizji dla pozycji
2aac pla                nie zmieniajc stosu odczytaj z niego wsp. pikselow X
2aad pha
2aae and #$07           we najmodsze 3 bity wsprzdnej pikselowej X
2ab0 bne $2ab5          jeli <> 0 -> $2ab5 (MK zajmuje 3 kratki w poziomie)
2ab2 lda #$02           badamy kolizje w 2 kratkach poziomych liczc od MK
2ab4 bit $03a9          jest to 'lda #3' (3 kratki poziome) od adresu $2ab5
2ab7 sta $2ac3          zapisz A jako argument instrukcji cpy poniej
2aba ldy #$00           bdziemy liczy kratki poziome w rejestrze Y
2abc jsr $290d          sprawd kolizj "od gry" na podstawie tablicy kolizji
2abf bcs $2ac8          jeeli jest kolizja -> $2ac8 (ustaw C i wyjd)
2ac1 iny                nastpna kratka pozioma
2ac2 cpy #$00           czy sprawdzono ju tyle ile miao by spr. (arg. ust.)
2ac4 bne $2abc          nie -> $2abc (sprawdzaj dalej)
2ac6 clc                skasuj C (nie napotkano kolizji)
2ac7 bit bufrfl         jest to sec od $2ac8 (jest kolizja)
2ac9 pla                odtwrz X ze stosu
2aca tax
2acb pla                odtwrz Y ze stosu
2acc tay
2acd rts

;

2ace txa                X na stos
2acf pha
2ad0 tya                Y na stos
2ad1 pha
2ad2 lsr @              /8 - przekszta wsprzdn Y do postaci kratkowej
2ad3 lsr @
2ad4 lsr @
2ad5 tay                do Y
2ad6 txa                wsprzdna pikselowa X do A
2ad7 lsr @              /8 - przekszta wsprzdn X do postaci kratkowej
2ad8 lsr @
2ad9 lsr @
2ada tax                do X
2adb jsr $2628          Oblicz w e3,4 adres elem. z tabl. kolizji dla pozycji
2ade pla                niezmieniajc stosu odczytaj z niego wsprzdn
2adf pha                pikselow Y
2ae0 and #$07           we najmodsze 3 bity wsprzdnej pikselowej Y
2ae2 bne $2ae7          jeli <> 0 -> $2ae7 (MK zajmuje 5 kratek w pionie)
2ae4 lda #$80           badamy kolizje $80 / $20 = 4 kratk. pion. liczc od MK
2ae6 bit $a0a9          jest to 'lda #$a0' (5 kratek pionowych) od adr. $2ae7
2ae9 sta $2af9          zapisz A jako argument instrukcji cpy poniej
2aec ldy #$00           bdziemy w Y przechowywa indeks to kratek pionowych
2aee jsr $2871          sprawd kolizj "z boku" na podstawie tablicy kolizji
2af1 bcs $2afd          jest kolizja -> $2afd (zwr 1 w C)
2af3 tya                do indeksu w Y dodaj 32 uzyskujc indeks do elementu
2af4 clc                w tablicy kolizji odpowiadajcego kratce poniej
2af5 adc #$20
2af7 tay                nowy indeks do Y
2af8 cpy #$00           czy sprawdzono ju tyle ile miao by spr. (arg. ust.)
2afa bne $2aee          nie -> $2aee (sprawdzaj dalej)
2afc clc                skasuj C (nie napotkano kolizji)
2afd pla                we Y ze stosu
2afe tay
2aff pla                we X ze stosu
2b00 tax
2b01 rts

; Tablica modyfikatorw wsprzdnej Y Magic Knighta podczas jego skoku

2b02 dta $06, $06, $06, $06, $05, $05, $05, $04, $04, $03, $02, $02, $01, $00
2b10 dta $00, $ff, $fe, $fe, $fd, $fc, $fc, $fb, $fb, $fb, $fa, $fa, $fa, $fa

; Pusta procedura dla niektrych lokacji

2b1e rts

; Procedura wykonywana w lokacji "THE BALLROOM"

2b1f lda #$00           wykonaj ruch zerow pieczk
2b21 jsr $1f7a
2b24 lda #$01           wykonaj ruch pierwsz pieczk
2b26 jsr $1f7a
2b29 lda #$02           wykonaj ruch drug pieczk
2b2b jsr $1f7a
2b2e lda #$03           wykonaj ruch trzeci pieczk
2b30 jsr $1f7a
2b33 rts

; Pusta procedura dla niektrych lokacji

2b34 rts

; Procedura wykonywana w lokacji "THE BIG BOTTLE"

2b35 jmp $2b39          skok do proc. wykonywanej w lok. "THE LITTLE BOTTLE"

; Pusta procedura dla niektrych lokacji

2b38 rts

; Procedura wykonywana w lokacji "THE LITTLE BOTTLE"

2b39 lda $0915          sprawd, czy rzucono czar "ARMOURIS PHOTONICUS"
2b3c and #$04
2b3e bne $2b38          tak -> $2b38 (rts)
2b40 lda #$10           Czy Magic Knight ma "GLOWING BOTTLE"?
2b42 jsr $18eb
2b45 beq $2b38          ma -> $2b38 (ok - rts)
2b47 lda $04c2          we nr lok., w ktrej znajduje si "GLOWING BOTTLE"
2b4a cmp #$12           czy jest to lokacja "THE LITTLE BOTTLE"?
2b4c beq $2b38          ma -> $2b38 (ok - rts)
2b4e lda #$21           Czy Magic Knight ma "ENGRAVED CANDLE"?
2b50 jsr $18eb
2b53 beq $2b5c          ma
2b55 lda $04f5          we nr lok., w ktrej znajduje si "ENGRAVED CANDLE"
2b58 cmp #$12           czy jest to lokacja "THE LITTLE BOTTLE"?
2b5a bne $2b63          nie -> $2b63 (koniec gry)
2b5c lda $0915          sprawd, czy rzucono czar "CANDELIUM ILLUMINATUS"
2b5f and #$02
2b61 bne $2b38          tak -> $2b38 (ok - rts)
2b63 lda #$00           [$30,1] = $8800 - pocztek pamici obrazu
2b65 sta $30
2b67 lda #$88
2b69 sta $31
2b6b ldy #$00           wypenij stron pamici o adresie pocz. w $30,1 zerami
2b6d tya
2b6e sta ($30),y
2b70 iny
2b71 bne $2b6e
2b73 inc $31            zwiksz numer strony
2b75 lda $31            sprawd, czy doszlimy do strony $9b (czy wyczyszczono
2b77 cmp #$9b           ju ($9b - $88) * 8 = 19 * 8 linii - gwne pole gry)
2b79 bne $2b6d          nie -> $2b6d (kontynuacja)
2b7b lda #$1f           Rysuj okienko nr. $1f
2b7d jsr $1727
2b80 ldx #$86           drukuj "SOMEBODY SWITCHED OUT THE LIGHT..."
2b82 ldy #$6f
2b84 jsr $148b
2b87 jsr $211c          Wydrukuj "Press fire to continue" i poczekaj na fire
2b8a ldx #$b3           drukuj "YOU HURT YOURSELF MOVING AROUND IN THE DARK"
2b8c ldy #$50           i zakocz gr
2b8e jmp $2c49

; Procedura wykonywana w lokacji "THE ODD-BALL"

2b91 lda #$00           wykonaj ruch zerow pieczk
2b93 jsr $1f7a
2b96 rts

; Pusta procedura dla niektrych lokacji

2b97 rts

; Procedura wykonywana w lokacji "THE GAS ROOM"

2b98 lda $0916          sprawd, czy rzucono czar "FUMATICUS PROTECTIUM"
2b9b and #$02
2b9d bne $2b97          nie -> $2b97 (rts)
2b9f lda #$1f           Rysuj okienko nr. $1f
2ba1 jsr $1727
2ba4 ldx #$03           drukuj "CHOKE... CHOKE..."
2ba6 ldy #$70
2ba8 jsr $148b
2bab jsr $211c          Wydrukuj "Press fire to continue" i poczekaj na fire
2bae ldx #$6b           drukuj "THE GAS GOT YOU" i zakocz gr
2bb0 ldy #$51
2bb2 jmp $2c49
2bb5 rts

; Procedura wykonywana w lokacji "THE SPARE BALLROOM"

2bb6 jmp $2b1f          skok do procedury wykonywanej dla lok. "THE BALLROOM"

; Pusta procedura dla niektrych lokacji

2bb9 rts

; Procedura wykonywana w lokacji "THE PIT"

2bba lda $0446          we pozycj Y Magic Knighta w pikselach trybu gr. 8
2bbd cmp #$71           czy jest ona rwna $71 (poziom dna dou na ekranie)?
2bbf bne $2bb9          nie -> $2bb9 (rts, MK nie wpad do dou)
2bc1 ldx #$8f           drukuj "YOU FELL INTO THE PIT OF DESTRUCTION..."
2bc3 ldy #$70           i zakocz gr
2bc5 jmp $2c49
2bc8 rts

; Pusta procedura dla niektrych lokacji

2bc9 rts

; Tablica adresw procedur wykonywanych w poszczeglnych lokacjach

2bca dta a($2b1e)       "THE LIFT"             - rts
2bcc dta a($2b1e)       "THE ROOF GARDEN"      - rts
2bce dta a($2b1e)       "THE ROOF GARDEN"      - rts
2bd0 dta a($2b1e)       "THE ROOF GARDEN"      - rts
2bd2 dta a($2b1e)       "THE ROOF GARDEN"      - rts
2bd4 dta a($2b1e)       "THE ROOF GARDEN"      - rts
2bd6 dta a($2b1e)       "THE ROOF GARDEN"      - rts
2bd8 dta a($2b1e)       "THE ROOF GARDEN"      - rts
2bda dta a($2b1e)       "THE ROOF GARDEN"      - rts
2bdc dta a($2b1e)       "THE TOWER"            - rts
2bde dta a($2b1e)       "BEYOND THE TOWER"     - rts
2be0 dta a($2b1e)       "FURTHER BEYOND THE TOWER" - rts
2be2 dta a($2b1f)       "THE BALLROOM" - procedura obsugujca pieczki
2be4 dta a($2b34)       "THE TREE OF KARN"     - rts
2be6 dta a($2b34)       "THE STALAGMITES"      - rts
2be8 dta a($2b35)       "THE BIG BOTTLE" - proc. sprawdz., czy MK ma owietl.
2bea dta a($2b38)       ""                     - rts
2bec dta a($2b38)       "THE LIBRARY"          - rts
2bee dta a($2b39)       "THE LITTLE BOTTLE" - sprawd, czy MK ma owietl.
2bf0 dta a($2b91)       "THE ODD-BALL" - procedura obsugujca pieczk
2bf2 dta a($2b97)       ""                     - rts
2bf4 dta a($2b97)       "THE START ROOM"       - rts
2bf6 dta a($2b97)       "THE L-SHAPED ROOM"    - rts
2bf8 dta a($2b97)       "THE PLANT ROOM"       - rts
2bfa dta a($2b97)       "MORE PLANT ROOM"      - rts
2bfc dta a($2b97)       ""                     - rts
2bfe dta a($2b97)       ""                     - rts
2c00 dta a($2b97)       ""                     - rts
2c02 dta a($2b97)       ""                     - rts
2c04 dta a($2b97)       "THE WALL"             - rts
2c06 dta a($2b97)       "THE GALLERY"          - rts
2c08 dta a($2b97)       "THE GALLERY"          - rts
2c0a dta a($2b97)       "THE GALLERY"          - rts
2c0c dta a($2b97)       "THE MUSH ROOM"        - rts
2c0e dta a($2b98)       "THE GAS ROOM" - sprawd, czy MK rzuci czar zabezp.
2c10 dta a($2bb5)       ""                     - rts
2c12 dta a($2bb5)       ""                     - rts
2c14 dta a($2bb6)       "THE SPARE BALLROOM" - procedura obsugujca pieczki
2c16 dta a($2bb9)       ""                     - rts
2c18 dta a($2bb9)       "THE TROPHY ROOM"      - rts
2c1a dta a($2bb9)       ""                     - rts
2c1c dta a($2bb9)       ""                     - rts
2c1e dta a($2bb9)       "SECRET TUNNEL ENTRANCE" - rts
2c20 dta a($2bb9)       "GIMBAL'S SECRECT STUDY" - rts
2c22 dta a($2bb9)       "THE SECRET TUNNEL"    - rts
2c24 dta a($2bb9)       "MORE SECRET TUNNEL"   - rts
2c26 dta a($2bba)       "THE PIT" - proc. sprawdz., czy MK nie wpad do dou
2c28 dta a($2bc8)       ""                     - rts
2c2a dta a($2bc9)       "THE MOST MAGIC ROOM"  - rts
2c2c dta a($2bc9)       "THE BASEMENT"         - rts

2c2e jsr $28ae          jeeli trzeba, zmie lokacj i zmie menu
2c31 jmp $2b1e          skok do proc. obsugujcej lokacj (arg. ustawiony)

; Procedura wpisuje jako argument jmp (powyej) adres procedury wykonywanej
; w biecej lokacji oraz ustala skad menu

2c34 lda $090d          we numer lokacji MK
2c37 asl @              *2
2c38 tax                X = indeks to tabl. adresw proc. wykonywanych w lok.
2c39 lda $2bca,x        we modszy bajt adresu procedury dla danej lokacji
2c3c sta $2c32          wstaw go jako argument jmp (powyej)
2c3f lda $2bcb,x        we starszy bajt adresu procedury dla danej lokacji
2c42 sta $2c33          wstaw go jako argument jmp (powyej)
2c45 jsr $1ce9          Ustal, jaki skad powinno mie menu
2c48 rts

; Procedura koczy gr drukujc wczeniej okienko z tekstem o adresie
; przekazanym w X i Y

2c49 stx $d5            zapisz X i Y do $d5,6 - adres dodatkowego tekstu
2c4b sty $d6                                    do wydrukowania
2c4d ldy #$00           zablokuj upyw czasu i losowe ruchy postaci
2c4f sty $0947
2c52 lda ($d5),y        we bajt poprzedzajcy tekst waciwy
2c54 sta $4bb6          jest to pozycja dolnej krawdzi okienka nr $21
2c57 jsr $1589          Zwiksz o 1 $d5,6
2c5a lda $d5            zapamitaj na stosie $d5,6, ktre wskazuje teraz
2c5c pha                na adres tekstu do wydrukowania
2c5d lda $d6
2c5f pha
2c60 lda #$21           Rysuj okienko nr. $21
2c62 jsr $1727
2c65 lda #$d7           wpisz do $30,1 adres na wpisanie wyliczonego progressu
2c67 sta $30            ($4fd7)
2c69 lda #$4f
2c6b sta $31
2c6d ldx #$e3           pozostaa liczba godzin czasu gry zostanie wpisana
2c6f ldy #$4f           w postaci dziesitnej poczwszy od adresu $4fe3
2c71 jsr $3d79          oblicz progress i wpisz pozostay jeszcze czas gry
2c74 ldx #$c0           drukuj tekst "GAME OVER, TOTAL COMPLETION..."
2c76 ldy #$4f
2c78 jsr $148b
2c7b pla                odtwrz ze stosu $d5,6, ktre wskazuje na adres tekstu
2c7c sta $d6            do wydrukowania w okienku
2c7e pla
2c7f sta $d5
2c81 jsr $148f          wydrukuj ten tekst
2c84 jsr $211c          Wydrukuj "Press fire to continue" i poczekaj na fire
2c87 jmp $0c28          restart gry

2c8a dta a($2ca8)       realizacja polecenia "PICK UP OBJECT"
     dta a($2f8c)       realizacja polecenia "DROP OBJECT"
     dta a($3973)       realizacja polecenia "TAKE OBJECT"
     dta a($3841)       realizacja polecenia "GIVE OBJECT"
     dta a($2071)       rysowanie menu i wykonywanie polece
     dta a($3ba2)       realizacja polecenia "EXAMINE"
     dta a($32d4)       realizacja polecenia "COMMAND A CHARACTER"
     dta a($31e5)       realizacja polecenia "LOCATE A CHARACTER"
     dta a($2ddf)       realizacja polecenia "TELEPORT"
     dta a($2ef3)       realizacja polecenia "READ SOMETHING"
     dta a($3a84)       realizacja polecenia "THROW SOMETHING"
     dta a($360e)       realizacja polecenia "CAST A SPELL"
     dta a($3066)       realizacja polecenia "BLOW SOMETHING"
     dta a($2e2f)       realizacja polecenia "CALL LIFT"
     dta a($2e86)       realizacja polecenia "MOVE LIFT"

; Realizacja polecenia "PICK UP OBJECT"

2ca8 jsr $40e6          Efekt dwikowy nr. 1
2cab jsr $2135          otwrz u dou ekranu okienko "COMMAND"
2cae ldx #$d9           dopisz w okienku "PICK UP"
2cb0 ldy #$57
2cb2 jsr $2197
2cb5 ldy #$00           Y = liczba przedmiotw w lokacji Magic Knighta
2cb7 ldx #$00           zacznij sprawdza od pierwszego przedmiotu
2cb9 lda $0492,x        rozpatrz kolejny przedmiot
2cbc cmp $090d          czy jest on w lokacji Magic Knighta?
2cbf bne $2cc2          nie
2cc1 iny                tak: zwiksz licznik przedmiotw
2cc2 inx
2cc3 inx
2cc4 inx                ustaw si na kolejny przedmiot
2cc5 cpx #$96           czy to ostatni?
2cc7 bne $2cb9          nie -> rozpatrz nastpny
2cc9 cpy #$00           czy znaleziono jakikolwiek przedmiot
2ccb bne $2cd0          tak -> przeskok nastpnej instrukcji
2ccd jmp $2267          Drukuj tekst "THERE IS NOTHING IN THIS ROOM"
2cd0 jsr $2d67          Przetwrz pozycj Magic Knighta na kratkow
2cd3 lda $2d7f          pozycja Y Magic Knighta -= 2
2cd6 sec
2cd7 sbc #$02
2cd9 sta $2d7f
2cdc ldy #$00           Y = liczba sprawdzonych przedmiotw
2cde ldx #$00           zacznij sprawdza od pierwszego przedmiotu
2ce0 lda $0492,x        rozpatrz kolejny przedmiot
2ce3 cmp $090d          czy jest on w lokacji Magic Knighta?
2ce6 bne $2d02          nie -> nastpny przedmiot
2ce8 inx
2ce9 inx
2cea lda $0492,x        we pozycj Y przedmiotu
2ced cmp $2d80          czy jest taka sama jak pozycja Y Magic Knighta?
2cf0 bne $2d04          nie -> nastpny przedmiot
2cf2 dex
2cf3 lda $0492,x        we pozycj X przedmiotu
2cf6 sec                oblicz: X przedmiotu - X Magic Knighta
2cf7 sbc $2d7f
2cfa bmi $2d03          jeli X Magic Knighta > X przedmiotu -> next item
2cfc cmp #$05           czy X przedmiotu - X Magic Knighta <= 5
2cfe bcc $2d0d          tak -> mona zrobi pick up
2d00 bcs $2d03          nie -> nastpny przedmiot
2d02 inx
2d03 inx
2d04 inx
2d05 iny                Y - numer nastpnego przedmiotu
2d06 cpx #$96           czy to ostatni przedmiot?
2d08 bne $2ce0          nie -> rozpatrz nastpny
2d0a jmp $2260          Drukuj tekst "THERE IS NOTHING NEAR ENOUGH"
2d0d sty $2d66          wstaw numer przedmiotu do komrki sprawdzanej
2d10 tya                przy drukowaniu tekstu w okienku
2d11 tax                wstaw ten numer do X
2d12 jsr $253f          Przeskocz do nazwy przedmiotu o numerze w X
2d15 ldx $d5            we adres kratki od ktrej trzeba wydrukowa nazw
2d17 ldy $d6            przedmiotu
2d19 jsr $2197          wydrukuj j
2d1c jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
2d1f lda $2d66          Czy przedmiot, ktry ma zosta podniesiony to
2d22 cmp #$22           STRANGE LIQUID?
2d24 bne $2d29          nie -> przeskok nastpnej instrukcji
2d26 jmp $231b          Drukuj tekst "THE LIQUID IS STUCK TO THE FLOOR..."
2d29 lda $0451          we ostatni bajt opisu stanu posiadania M.K.
2d2c beq $2d31          jeli rwny 0 -> przeskocz nastpn instrukcj
2d2e jmp $2252          Drukuj tekst "YOUR HANDS ARE FULL"
2d31 jsr $2d98          Sprawd, czy Magic Knight moe podnie przedmiot
2d34 bcc $2d39          C = 0 -> moe
2d36 jmp $2259          Drukuj tekst "THAT OBJECT IS TOO HEAVY"
2d39 lda $2d66          we numer przedmiotu, ktry ma by podniesiony
2d3c jsr $2d81          wstaw do stanu posiadania MK przedmiot podany w A
2d3f lda $2d66          we numer przedmiotu, ktry ma by podniesiony
2d42 asl @              * 3
2d43 clc
2d44 adc $2d66
2d47 tax
2d48 lda #$63           wpisz do tablicy rozmieszczenia przedmiotw, e
2d4a sta $0492,x        ten przedmiot jest niesiony przez kogo (MK)
2d4d lda #$c5           tekstem dodatkowym, drukowanym przy otwieraniu okienka
2d4f sta $092b          przez procedur $255f bdzie "YOU ARE NOW CARRYING"
2d52 lda #$57           (adres $57c5)
2d54 sta $092c
2d57 jsr $31c9          Ustaw $e1,2 na adres stanu posiadania Magic Knighta
2d5a jsr $255f          Narysuj okienko z nazwami przedmiotw bez strzaki
2d5d jsr $211c          Wydrukuj "Press fire to continue" i poczekaj na fire
2d60 jsr $1ce9          Ustal, jaki skad powinno mie menu
2d63 jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr
2d66 dta 0

; Przetwrz aktualn pozycj Magic Knighta z pikselowej na kratkow

2d67 lda $0445          we aktualn poz. X MK w pikselach trybu gr. 8
2d6a lsr @
2d6b lsr @
2d6c lsr @              / 8
2d6d sta $2d7f          zapisz w komrce tymczasowej
2d70 ldy $0446          we aktualn pozycj Y MK w pikselach trybu gr. 8
2d73 dey                - 1
2d74 tya
2d75 lsr @
2d76 lsr @
2d77 lsr @              / 8
2d78 clc
2d79 adc #$03           + 3
2d7b sta $2d80          zapisz w komrce tymczasowej
2d7e rts
2d7f dta a(0)

; Wstaw do stanu posiadania Magic Knighta przedmiot o numerze podanym w A

2d81 pha                numer przedmiotu do wstawienia na stos
2d82 jsr $31c9          Ustaw $e1,2 na adres stanu posiadania Magic Knighta
2d85 pla                we numer przedmiotu do wstawienia

; Wstaw do stanu posiadania postaci (adres w [$e1]) przedmiot o numerze w A

2d86 pha                numer na stos
2d87 ldy #$00
2d89 lda ($e1),y        czy kod kolejnego przedmiotu jest rwny 0 (brak)?
2d8b beq $2d94          tak -> przeskok za rts
2d8d iny                kolejny przedmiot
2d8e cpy #$05           czy rozpatrzono ju wszystkie?
2d90 bne $2d89          nie -> skok na pocztek ptli
2d92 pla                we numer przedmiotu ze stosu
2d93 rts                (posta niesie ju 5 przedmiotw)
2d94 pla                we numer przedmiotu ze stosu
2d95 sta ($e1),y        wstaw go w wolne miejsce
2d97 rts

; Sprawd, czy Magic Knight moe ponie jeszcze przedmiot o numerze
; znajdujcym si w [$2d66]. C = 1 -> nie moe, C = 0 -> moe

2d98 jsr $31c9          Ustaw $e1,2 na adres stanu posiadania Magic Knighta
2d9b lda $03fd          we si Magic Knighta
2d9e pha                wstaw j na stos
2d9f ldy #$00           zainicjuj komrk, ktra bdzie zawiera sum ciaru
2da1 sty $2dbc          przedmiotw niesionych do tej pory przez Magic Knighta
2da4 lda ($e1),y        we numer kolejnego przedmiotu
2da6 beq $2db7          jeli rwny 0 -> wyskocz z ptli
2da8 jsr $2dc9          Odczytaj WEIGHT przedmiotu o numerze w A
2dab clc
2dac adc $2dbc          dodaj do ciaru poprzednich przedmiotw
2daf sta $2dbc
2db2 iny                nastpny przedmiot
2db3 cpy #$05           jeli jeszcze nie wszystkie -> skok na pocztek ptli
2db5 bne $2da4
2db7 pla                odtwrz ze stosu si Magic Knighta
2db8 and #$7f           prawdopodobnie niepotrzebne wyodrbnienie 7 bitw
2dba sec
2dbb sbc #$00           odejmij od niej ciar niesionych przedmiotw
2dbd sta $2dc7          zapisz w komrce pomocniczej
2dc0 lda $2d66          we numer przedmiotu, ktry ma zosta podniesiony
2dc3 jsr $2dc9          Odczytaj WEIGHT przedmiotu o numerze w A
2dc6 cmp #$00           porwnaj z "pozosta jeszcze" si Magic Knighta
2dc8 rts

; Odczytaj wag przedmiotu o numerze w A

2dc9 sta $2dcf          przechowaj A (numer przedmiotu)
2dcc tya                Y na stos
2dcd pha
2dce lda #$00           odtwrz A (numer przedmiotu)
2dd0 jsr $1982          Zwr w $d9,a adres opisu przedmiotu o numerze w A
2dd3 ldy #$00           we pierwszy bajt opisu przedmiotu (WEIGHT)
2dd5 lda ($d9),y
2dd7 sta $2ddd          przechowaj go
2dda pla                we Y ze stosu
2ddb tay
2ddc lda #$00           odtwrz A (WEIGHT)
2dde rts

; Realizacja polecenia "TELEPORT"

2ddf lda $091f          Czy wolno uy polecenia "TELEPORT"
2de2 and #$04
2de4 bne $2de9          Z = 1 ->  tak - przeskok nastpnej instrukcji
2de6 jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr
2de9 jsr $40e6          Efekt dwikowy nr. 1
2dec jsr $2135          otwrz u dou ekranu okienko "COMMAND"
2def ldx #$33           dopisz w okienku "TELEPORT"
2df1 ldy #$6b
2df3 jsr $2197
2df6 jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
2df9 lda $0525          we lokalizacj "TELEPORT PAD"
2dfc cmp #$63           czy jest ona rwna $63 (ma j jaka posta)?
2dfe bne $2e03          nie -> przeskocz nastpn instrukcj
2e00 jmp $2312          Drukuj tekst "IT IS NOT SAFE TO TELEPORT"
2e03 lda $0525          we jeszcze raz lokacj, w ktrej znajduje si
2e06 sta $090d          "TELEPORT PAD". Niech to bdzie nowa lokacja M.K.
2e09 lda $0526          we pozycj X "TELEPORT PAD"
2e0c asl @
2e0d asl @
2e0e asl @              *8
2e0f sta $0445          zapisz to jako akt. poz. X MK w pikselach trybu gr. 8
2e12 sta $0448          i jako pozycj nastpn
2e15 lda $0527          we pozycj Y "TELEPORT PAD"
2e18 sec
2e19 sbc #$03           -3
2e1b asl @              *8
2e1c asl @
2e1d asl @
2e1e clc                +1
2e1f adc #$01
2e21 sta $0446          zapisz jako aktualn pozycj Y MK
2e24 sta $0449          bdzie to nastpna pozycja Y Magic Knighta
2e27 lda #$01           ustaw tryb pojawiania si MK w dymku
2e29 sta $0928
2e2c jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr

; Realizacja polecenia "CALL LIFT"

2e2f lda $091f          Czy wolno uy polecenia "CALL LIFT"?
2e32 and #$80
2e34 bne $2e39          Z = 1 ->  tak - przeskok nastpnej instrukcji
2e36 jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr
2e39 jsr $40e6          Efekt dwikowy nr. 1
2e3c jsr $2135          otwrz u dou ekranu okienko "COMMAND"
2e3f ldx #$cc           dopisz w okienku "CALL LIFT"
2e41 ldy #$6e
2e43 jsr $2197
2e46 jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
2e49 jsr $2e70          zablokuj wyjcia "do" i "z" windy na wszystkich pitr.
2e4c lda $090d          we numer lokacji Magic Knighta
2e4f sec                -1 (w najstarszych 5 bitach bdzie zapisany numer
2e50 sbc #$01               pitra)
2e52 lsr @              /8 (uzyskujemy w ten sposb, liczc od dachu, od 0,
2e53 lsr @                  numer pitra na ktrym znajduje si Magic Knight)
2e54 lsr @
2e55 and #$07           dla pewnoci, e jest on < 8
2e57 sta $0927          zapisujemy go w komrce zawierajcej pooenie windy
2e5a lda $090d          we numer lokacji Magic Knighta
2e5d asl @              *2
2e5e tax                bdzie to indeks to tablicy pocze midzy lokacjami
2e5f lda #$00           w A umie kod lokacji "THE LIFT"
2e61 sta $4a37,x        ustaw go jako nr lok. po lewej od lokacji biecej MK
2e64 lda $090d          we nr lokacji Magic Knighta
2e67 sta $4a38          wstaw go jako nr lok. po prawej dla lokacji "THE LIFT"
2e6a jsr $40f5          Efekt dwikowy nr. 6
2e6d jmp $22e5          Drukuj tekst "THE LIFT IS HERE"

; Ustaw "brak wyjcia po lewej stronie" dla pierszej lokacji na kadym pitrze
; oraz "brak wyjcia po prawej stronie" dla lokacji "THE LIFT"

2e70 ldx #$00           bdziemy zaczynali od pitra zerowego (ROOF)
2e72 lda #$ff           wstaw do A kod "braku wyjcia"
2e74 sta $4a39,x        bdzie to kod wyjcia w lewo w pierw. lok. na pitrze
2e77 txa                zwiksz X o $10 - uzyskaj indeks do pierwszej lokacji
2e78 clc                                  nastpnego pitra
2e79 adc #$10           ($10 = 8 * 2 - opis kadej lokacji w tablicy zajmuje
2e7b tax                               2 bajty)
2e7c cpx #$70           czy doszlimy ju do ostatniego pitra?
2e7e bne $2e72          nie -> $2e72
2e80 lda #$ff           we do A kod braku wyjcia
2e82 sta $4a38          ustaw go jako kod wyjcia w prawo w lokacji "THE LIFT"
2e85 rts

; Realizacja polecenia "MOVE LIFT"

2e86 lda $0920          Czy wolno uy polecenia "MOVE LIFT"?
2e89 and #$01
2e8b bne $2e90          Z = 1 ->  tak - przeskok nastpnej instrukcji
2e8d jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr
2e90 jsr $40e6          Efekt dwikowy nr. 1
2e93 jsr $2135          otwrz u dou ekranu okienko "COMMAND"
2e96 ldx #$df           dopisz w okienku "MOVE LIFT TO THE"
2e98 ldy #$6e
2e9a jsr $2197
2e9d lda #$19           narysuj okienko ze strzak o numerze $19
2e9f jsr $171e
2ea2 ldx #$e9           drukuj tekst "TAKE LIFT TO/A  ROOF/B  4TH FLOOR..."
2ea4 ldy #$6e
2ea6 jsr $148b
2ea9 jsr $1af6          zwr w A identyfikator wybranej joystickiem pozycji
2eac sec                odejmij od niego $41 uzyskujc numer pitra (od gry,
2ead sbc #$41           liczc od zera, na ktre ma pojecha winda)
2eaf sta $2ed9          zapisz go w pomocniczej komrce (argument LDA)
2eb2 tax                numer pitra do X
2eb3 lda #$1f           zapisz w $d5,6 adres pocztku nazwy pitra o numerze
2eb5 ldy #$6f           w X
2eb7 jsr $2543
2eba ldx $d5            pobierz ten adres i zapisz go w X i Y
2ebc ldy $d6
2ebe jsr $2197          wydrukuj nazw pitra w pomocniczym okienku u dou
2ec1 jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
2ec4 lda $093a          sprawd, czy MK prosi o pomoc Thora w sprawie windy
2ec7 and #$01
2ec9 bne $2ed5          nie -> $2ed5
2ecb lda $2ed9          pobierz numer pitra na ktre ma pojecha winda
2ece cmp #$05           czy jest on mniejszy ni 5?
2ed0 bcc $2ed5          tak -> $2ed5
2ed2 jmp $23bc          Drukuj tekst "THE LIFT IS BROKEN AND CANNOT..."
2ed5 jsr $2e70          zablokuj wyjcia "do" i "z" windy na wszystkich pitr.
2ed8 lda #$00           numer pitra na ktre mamy jecha (argument ustawiony)
2eda sta $0927          zapamitujemy go jako pooenie windy
2edd asl @              *8
2ede asl @
2edf asl @
2ee0 clc                +1 - powstanie numer pierwszej lokacji na tym pitrze
2ee1 adc #$01
2ee3 sta $4a38          ustaw go jako nr lok po prawej dla lokacji "THE LIFT"
2ee6 asl @              *2
2ee7 tax                bdzie to indeks do elem. tablicy pocze midzy lok.
2ee8 lda #$00           w A umie kod lokacji "THE LIFT"
2eea sta $4a37,x        bdzie to nr lok. po lewej dla pierw. lok. na pitrze
2eed jsr $4161          wolne miganie ramk ekranu (jazda wind)
2ef0 jmp $22ee          Drukuj tekst "THE LIFT HAS ARRIVED"

; Realizacja polecenia "READ SOMETHING"

2ef3 lda $091f          Czy wolno uy polecenia "READ SOMETHING"?
2ef6 and #$08
2ef8 bne $2efd          Z = 1 (tak) -> - przeskok nastpnej instrukcji
2efa jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr
2efd jsr $40e6          Efekt dwikowy nr. 1
2f00 jsr $31c9          Ustaw $e1,2 na adres stanu posiadania Magic Knighta
2f03 ldx #$4e           Otwrz okienko z list przedmiotw oraz okienko
2f05 ldy #$5f           "COMMAND", do ktrego wpisz "READ" (adres: $5f4e).
2f07 lda #$47           Lista przedmiotw ma zosta poprzedzona tekstem
2f09 sta $092b          "READ WHICH OBJECT ?" (adres: $5f47)
2f0c lda #$5f
2f0e sta $092c
2f11 jsr $2567          skok do procedury wywietlajcej okienko
2f14 jsr $2f77          wpisz nazw wybranego przedmiotu do okienka "COMMAND"
2f17 jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
2f1a lda $2d66          we nr przedmiotu (ustawiony przed procedur $2f77)
2f1d cmp #$29           czy przedmiotem jest "INSTRUCTION BOOK"?
2f1f bne $2f27          nie -> $2f77
2f21 jsr $1c97          wywoanie procedury drukujcej instrukcj do gry
2f24 jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr
2f27 cmp #$01           czy przedmiotem jest "ANCIENT SCROLL"?
2f29 bne $2f3d          nie -> $2f3d
2f2b lda $0915          czy rzucono czar "CANDELIUM ILLUMINATUS"?
2f2e and #$02
2f30 beq $2f5b          nie -> $2f5b (wypisz standardowy tekst)
2f32 lda #$21           Czy Magic Knight ma "ENGRAVED CANDLE?"
2f34 jsr $18eb
2f37 bne $2f5b          nie ma -> $2f5b (wypisz standardowy tekst)
2f39 ldx #$08           zaaduj do X nr komunikatu, ktry zostanie wydrukowany
2f3b bne $2f6d          skok bezwarunkowy do fragmentu drukujcego opis
2f3d cmp #$21           czy przedmiotem jest "ENGRAVED CANDLE"
2f3f bne $2f4c          nie -> $2f4c
2f41 lda #$0e           Czy Magic Knight ma Broken Glass?
2f43 jsr $18eb
2f46 bne $2f5b          nie ma
2f48 ldx #$09           zaaduj do X nr komunikatu, ktry zostanie wydrukowany
2f4a bne $2f6d          skok bezwarunkowy do fragmentu drukujcego opis
2f4c cmp #$0d           czy przedmiotem jest "RUNESTONE"
2f4e bne $2f5b          nie -> $2f5b
2f50 lda #$0f           Czy Magic Knight ma BOOK OF RUNES?
2f52 jsr $18eb
2f55 bne $2f5b          nie ma
2f57 ldx #$0a           zaaduj do X nr komunikatu, ktry zostanie wydrukowany
2f59 bne $2f6d          skok bezwarunkowy do fragmentu drukujcego opis
2f5b lda $2d66          we numer przedmiotu, ktrego dotyczy polecenie
2f5e jsr $1982          Zwr w $d9,a adres opisu przedmiotu o numerze w A
2f61 ldy #$02           we READ STATUS tego przedmiotu
2f63 lda ($d9),y
2f65 bmi $2f6a          jeeli >= $80 -> $2f6a (jest opis)
2f67 jmp $2309          Drukuj tekst "THERE IS NO WRITING FOR ME TO READ"
2f6a and #$7f           pobierz nr napisu bdcym tekstem do wydrukowania
2f6c tax                przelij go do X
2f6d jsr $2551          ustaw $d5,6 na pocztek opisu przedmiotu o numerze X
2f70 ldx $d5            zaaduj adres opisu do odpowiednich rejestrw
2f72 ldy $d6
2f74 jmp $23e8          skocz do procedury drukujcej opis w odpowiednim oknie

; Procedura drukuje w narysowanym ju okienku "COMMAND", nazw przedmiotu o
; identyfikatorze przekazanym w A, bdcym w posiadaniu Magic Knighta.

2f77 sec                A -= $41 (jest to numer, liczc od zera, przedmiotu
2f78 sbc #$41                     posiadanego przez Magic Knighta)
2f7a tay                Y = A
2f7b lda ($e1),y        we numer przedmiotu (nadany kademu przedmiotowi)
2f7d sta $2d66          wpisz go do komrki pomocniczej
2f80 tax                przelij go do X
2f81 jsr $253f          przeskocz do pocztku nazwy tego przedmiotu
2f84 ldx $d5            pobierz ten adres, ktry procedura wywoana powyej
2f86 ldy $d6            zapisaa w $d5,6
2f88 jsr $2197          wpisz ten tekst do okienka "COMMAND"
2f8b rts

; Realizacja polecenia "DROP OBJECT"

2f8c jsr $40e6          Efekt dwikowy nr. 1
2f8f jsr $31c9          Ustaw $e1,2 na adres stanu posiadania Magic Knighta
2f92 lda #$54           Otwrz okienko z list przedmiotw oraz okienko
2f94 sta $092b          "COMMAND", do ktrego wpisz "DROP" (adres: $585f).
2f97 lda #$58           Lista przedmiotw ma zosta poprzedzona tekstem
2f99 sta $092c          "DROP WHICH OBJECT ?" (adres: $5854).
2f9c ldx #$5f
2f9e ldy #$58
2fa0 jsr $2567          skok do procedury wywietlajcej okienko
2fa3 jsr $2f77          wpisz nazw wybranego przedmiotu do okienka "COMMAND"
2fa6 jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
2fa9 lda $2d66          we numer przedmiotu (ustawiony przez proc. $2f77)
2fac jsr $1982          Zwr w $d9,a adres opisu przedmiotu o numerze w A
2faf ldy #$01           Czy ten przedmiot ma "DROP STATUS" ustawiony na
2fb1 lda ($d9),y        "YES"
2fb3 and #$01
2fb5 beq $2fba          tak -> przeskocz nastpn instrukcj
2fb7 jmp $226e          Drukuj tekst "YOU CANNOT DROP THAT OBJECT"
2fba lda $2d66          we numer przedmiotu, ktrego dotyczy polecenie
2fbd cmp #$10           czy jest to "GLOWING BOTTLE"?
2fbf bne $2fc7          nie -> $2fc7
2fc1 jsr $2ffd          uwolnij BANSHEE, w A bdzie si kod "BROKEN GLASS"
2fc4 jmp $2fd0          skok do miejsca, gdzie dla przedm. w A szuka si poz.
2fc7 lda $2d66          we numer przedmiotu (ustawiony przez proc. $2f77)
2fca jsr $3044          usu przedmiot o kodzie w A ze stanu posiadania MK
2fcd lda $2d66          $2d66 - numer wyrzucanego przedmiotu
2fd0 sta $2fd6
2fd3 asl @
2fd4 clc
2fd5 adc #$00           * 3
2fd7 tax
2fd8 lda $090d          wyrzucany przedmiot bdzie si znajdowa w lokacji
2fdb sta $0492,x        zajmowanej przez Magic Knighta
2fde jsr $2d67          Przetwrz pozycj MK i zapisz j w $2d7f,80
2fe1 lda $0445          we aktualn pozycj X MK w pikselach trybu gr. 8
2fe4 and #$07           we trzy najmodsze bity (przes. wzgld. pocz. kratki)
2fe6 bne $2feb          gdy MK nie na pocz. kratki -> $2feb (przedm. w nast.)
2fe8 lda #$00           MK jest na pocz. kratki - do jego pozycji dodajemy 0
2fea bit $01a9          jest to lda #1 widziane od $2feb i nop w przec. przyp.
2fed clc                dodaj do tego pozycj kratkow X Magic Knighta
2fee adc $2d7f
2ff1 sta $0493,x        bdzie to nowa pozycja X przedmiotu
2ff4 lda $2d80          we przetworzon pozycj Y Magic Knighta
2ff7 sta $0494,x        bdzie to nowa pozycja Y przedmiotu
2ffa jmp $2d4d          wywietl "YOU ARE NOW CARRYING ..." i zakocz obsug

2ffd lda #$10           zaaduj do A nr przypisany "GLOWING BOTTLE"
2fff jsr $3044          Usu "GLOWING BOTTLE" ze stanu posiadania MK
3002 lda #$1a           Rysuj okienko nr. $1a
3004 jsr $1727
3007 ldx #$95           drukuj "YOU DROPPED THE BOTTLE...BANSHEE"
3009 ldy #$58
300b jsr $148b
300e jsr $211c          Wydrukuj "Press fire to continue" i poczekaj na fire
3011 lda $0947          zablokuj losowe przemieszczanie postaci
3014 and #$01
3016 sta $0947
3019 lda $0915          ustaw najmodszy bit w komrce o numerze $0915,
301c ora #$01           co oznacza, e pojawia si nowa posta: BANSHEE
301e sta $0915
3021 ldx #$07           bdziemy poszukiwa miejsca dla BANSHEE (posta nr 7)
3023 lda $090d          we nr lokacji MK - bdzie to lokacja dla BANSHEE
3026 jsr $1e3a          zwr w X, Y woln pozyc. dla postaci w X dla lok. w A
3029 cmp #$04           czy udao si znale woln pozycj dla BANSHEE?
302b beq $3039          nie -> $3039
302d lda $090d          nr lokacji MK zapisz jako nr lokacji BANSHEE
3030 sta $048f
3033 stx $0490          odczytane wsprzdne pozycji zapisz jako wsprzdne
3036 sty $0491          BANSHEE
3039 lda $0947          odblokuj losowe przemieszczanie si postaci
303c ora #$02
303e sta $0947
3041 lda #$0e           we do A kod przedmiotu "BROKEN GLASS"
3043 rts

; Ustaw $e1,2 na stan posiadania Magic Knighta i usu z niego przedmiot
; o numerze w A

3044 pha
3045 jsr $31c9          Ustaw $e1,2 na adres stanu posiadania Magic Knighta
3048 pla

; Usu przedmiot o numerze w A ze stanu posiadania postaci (adres w [$e1])

3049 ldy #$00
304b cmp ($e1),y        sprawd, czy to ten przedmiot
304d beq $3055          tak -> przeskok za rts
304f iny
3050 cpy #$05
3052 bne $304b
3054 rts
3055 iny                we nastpny przedmiot
3056 lda ($e1),y
3058 dey                wstaw w przedmiot biecy
3059 sta ($e1),y
305b iny                zwiksz numer przedmiotu
305c cpy #$05           czy ju wszystkie?
305e bne $3055          nie -> skok na pocztek ptli
3060 lda #$00           ustaw ostatni przedmiot ($04) na 0 (brak przedmiotu)
3062 dey
3063 sta ($e1),y
3065 rts

; Realizacja polecenia "BLOW SOMETHING"

3066 lda $091f          Czy wolno uy polecenia "BLOW SOMETHING"?
3069 and #$40
306b bne $3070          Z = 1 ->  tak - przeskok nastpnej instrukcji
306d jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr
3070 jsr $40e6          Efekt dwikowy nr. 1
3073 jsr $31c9          Ustaw $e1,2 na adres stanu posiadania Magic Knighta
3076 lda #$52           Otwrz okienko z list przedmiotw oraz okienko
3078 sta $092b          "COMMAND", do ktrego wpisz "BLOW" (adres: $6d5d).
307b lda #$6d           Lista przedmiotw ma zosta poprzedzona tekstem
307d sta $092c          "BLOW " (adres: $6d52)
3080 ldx #$5d
3082 ldy #$6d
3084 jsr $2567          skok do procedury wywietlajcej okienko
3087 jsr $2f77          wpisz nazw wybranego przedmiotu do okienka "COMMAND"
308a lda $2d66          we nr tego przedmiotu (wpisaa go tam w/w procedura)
308d cmp #$26           czy jest to "ELF-HORN"?
308f beq $3094          tak -> $3094 (przeskocz nastpn instrukcj)
3091 jmp $3189          wywietl okienko "EXECUTE/REJECT" i wykonaj polecenie
3094 lda $0947          zablokuj losowe przemieszczanie si postaci
3097 and #$01
3099 sta $0947
309c jsr $2135          otwrz u dou ekranu okienko "COMMAND"
309f ldx #$63           dopisz w okienku "SUMMON"
30a1 ldy #$6d
30a3 jsr $2197
30a6 ldx #$0c           drukuj okienko z nazwami postaci i tekstem:
30a8 ldy #$53           "WHO DO YOU WANT TO SUMMON ?"
30aa jsr $24d0          numer wybranej postaci zwr w $0913
30ad jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
30b0 jsr $31a8          Niech X = 3 * [$0913]
30b3 lda $090d          sprawd, czy MK znajduje si w tym samym pokoju,
30b6 cmp $047a,x        co wybrana posta
30b9 bne $30be          nie -> $30be
30bb jmp $2337          Drukuj tekst "GIMBAL THE WIZARD IS ALREADY HERE"
30be lda $047a,x        we numer pokoju w ktrym znajduje si posta
30c1 ldx #$6a           zaaduj do X i Y adres tekstu "...IS NO LONGER AROUND"
30c3 ldy #$6e
30c5 cmp #$64           czy numer pokoju postaci jest rwny $64
30c7 bne $30cc          nie -> skok do $30cc
30c9 jmp $23f2          tak (postaci nie ma) -> drukuj tekst o adresie w X i Y
30cc lda $0913          We numer wybranego przedmiotu
30cf cmp #$07           Czy to jest "WAND OF COMMAND"?
30d1 beq $30f5          tak -> id do $30f5
30d3 jsr $31b4          Oblicz adres pocztku atrybutw postaci o numerze w A
30d6 ldy #$06           we wskanik spania
30d8 lda ($d9),y
30da bpl $30df          jeeli posta nie pi -> $30df
30dc jmp $2322          Drukuj tekst "GIMBAL THE WIZARD IS ASLEEP"
30df ldy #$01           Jeeli HAPPINESS jest mniejsza od $28 to posta
30e1 lda ($d9),y        "DOES NOT WANT"
30e3 cmp #$28
30e5 bcs $30ea
30e7 jmp $2329          Drukuj tekst "GIMBAL THE WIZARD...TO BE SUMMONED"
30ea ldy #$02           Jeeli STAMINA jest mniejsza od $1e to posta jest
30ec lda ($d9),y        "TOO TIRED"
30ee cmp #$1e
30f0 bcs $30f5
30f2 jmp $2330          Drukuj tekst "...TOO TIRED TO BE SUMMONED"
30f5 lda $090d          we numer lokacji MK - bdzie to lokacja dla postaci
30f8 ldx $0913          wstaw do X nr postaci, dla ktrej szukamy pozycji
30fb jsr $1e3a          zwr w X, Y woln pozyc. dla postaci w X dla lok. w A
30fe cmp #$04           czy znaleziono woln pozycj?
3100 bne $3105          tak -> przeskocz nastpn instrukcj
3102 jmp $233e          Drukuj tekst "...DOES NOT WANT...CROWDED..."
3105 stx $3117          zapisz wsprzdne X i Y jako argumenty instrukcji
3108 sty $311c          lda (poniej)
310b jsr $31a8          Niech X = 3 * [$0913]
310e lda $090d          we numer lokacji Magic Knighta
3111 ora #$80           ustaw najstarszy bit (posta pojawi si w dymku)
3113 sta $047a,x        bdzie to numer lokacji dla postaci
3116 lda #$00           we now pozycj X postaci (argument zosta ustawiony)
3118 sta $047b,x        zapisz j do tablicy zawierajcej rozmieszczenie post.
311b lda #$00           we now pozycj Y postaci (argument zosta ustawiony)
311d sta $047c,x        zapisz j do tablicy zawierajcej rozmieszczenie post.
3120 lda $0913          we numer postaci, ktr zamierzamy przywoa
3123 cmp #$07           czy jest to BANSHEE?
3125 beq $314c          tak -> $314c (nie ma zmniejszania atrybutw)
3127 jsr $31b4          Oblicz adres pocztku atrybutw postaci o numerze w A
312a ldy #$00           Zmniejsz STRENGTH o $0a
312c lda ($d9),y
312e sec
312f sbc #$0a
3131 sta ($d9),y
3133 iny                Zmniejsz HAPPINESS o $05
3134 lda ($d9),y
3136 sec
3137 sbc #$05
3139 sta ($d9),y
313b iny                Zmniejsz STAMINA o $0c
313c lda ($d9),y
313e sec
313f sbc #$0c
3141 sta ($d9),y
3143 lda $0400          zmniejsz o 3 POWER Magic Knighta
3146 sec                (atrybut ten jednak nie jest nigdy sprawdzany)
3147 sbc #$03
3149 sta $0400
314c lda $093b          we zawarto kom., w ktrej pamitamy rzucone czary
314f and #$10           czy rzucono "RELEASE SPELL"?
3151 bne $3156          tak -> $3156 (sprawd, czy nie odsyamy postaci)
3153 jmp $2345          Drukuj tekst "...APPEARS IN A THICK PUFF OF SMOKE"
3156 ldx $0944          wpisz do A, ile postaci odesano przez "ELF-HORN"
3159 lda $31a0,x        we numer postaci, ktra powinna by teraz odesana
315c cmp $0913          czy to nr postaci, ktr przywoujemy?
315f bne $3153          nie -> $3153 (przywoanie zwyke)
3161 sta $3167          zapisz nr postaci jako argument adc (poniej)
3164 asl @              nr postaci * 2
3165 clc                dodaj nr postaci (uzyskaj pomnoenie przez 3)
3166 adc #$00           argument adc jest ustawiany
3168 tay                bdzie to indeks to tabeli rozmieszczenia postaci
3169 lda #$64           w A wpisz kod oznaczajcy, e posta odesano
316b sta $047a,y        zapisz to jako nr lok., w ktrej znajduje si posta
316e inx                zwiksz o 1 X (liczba odesanych wczeniej postaci)
316f cpx #$08           czy odesalimy ju 8?
3171 bne $3176          nie -> przeskocz nastpn instrukcj
3173 jmp $3fa2          skok do procedury koca gry
3176 stx $0944          zapisz now liczb odesanych postaci do komrki
3179 inc $0943          zwiksz o 1 liczb uwolnionych postaci
317c jsr $4199          szybkie miganie ramk obrazu (rzucanie czaru)
317f ldx #$7f           drukuj tekst: "... APPEARS IN SPIRIT FORM ..."
3181 ldy #$6e
3183 jmp $23f2
3186 jmp $2345          Drukuj tekst "...APPEARS IN A THICK PUFF OF SMOKE"
3189 jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
318c lda $2d66          we numer przedmiotu, ktrego dotyczy polecenie
318f jsr $1982          Zwr w $d9,a adres opisu przedmiotu o numerze w A
3192 ldy #$04           we THROW/BLOW status tego przedmiotu
3194 lda ($d9),y
3196 and #$01           wyodrbnij BLOW STATUS
3198 beq $319d          jeeli nie mona dmucha -> $319d (przeskocz instruk.)
319a jmp $22f7          Drukuj tekst "WHAT A RACKET..."
319d jmp $2300          Drukuj tekst "WHAT A LOT OF DUST..."

; Kolejno przywoywania postaci: ELRAND HALFELVEN (5), SAMSUN THE STRONG (4), THOR (1), LADY ROSMAR (6), THE BANSHEE (8),
; FLORIN THE DWARF (3), ORIK THE CLERIC (4), GIMBAL THE WIZARD (0)

31a0 dta $05, $04, $01, $06, $07, $02, $03, $00

; Niech X = 3 * [$0913] (numer postaci, ktrej dotyczy polecenie)

31a8 lda $0913
31ab sta $31b1
31ae asl @
31af clc
31b0 adc #$00
31b2 tax
31b3 rts

; Oblicz adres pocztku atrybutw postaci o numerze w A (pocztek tabeli
; atrybutw $0405)

31b4 asl @              A * 2
31b5 asl @              A * 4
31b6 ldy #$00
31b8 sty $da
31ba asl @              A * 8
31bb rol $da
31bd clc                + $05
31be adc #$05
31c0 sta $d9
31c2 lda $da            + $0400
31c4 adc #$04
31c6 sta $da
31c8 rts

; Niech $e1,2 wskazuje na adres od ktrego zapisany jest stan posiadania
; Magic Knighta ($044d)

31c9 lda #$4d
31cb sta $e1
31cd lda #$04
31cf sta $e2
31d1 rts

; Oblicz w $e1,2 adres stanu posiadania postaci o numerze podanym w A

31d2 sta $31d9          numer ten zapisujemy jako argument ADC
31d5 asl @              *4
31d6 asl @
31d7 clc
31d8 adc #$00           dodajemy numer postaci, bo mona nie 5 przedmiotw
31da adc #$52           do wyliczonego offsetu dodajemy $0452, bo od tego
31dc sta $e1            adresu zaczynaja si tablica stanw posiadania
31de lda #$04
31e0 adc #$00
31e2 sta $e2
31e4 rts

; Realizacja polecenia "LOCATE A CHARACTER"

31e5 lda $091f          Czy wolno uy polecenia "LOCATE A CHARACTER"?
31e8 and #$02
31ea bne $31ef          Z = 1 ->  tak - przeskok nastpnej instrukcji
31ec jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr
31ef jsr $40e6          Efekt dwikowy nr. 1
31f2 jsr $2135          otwrz u dou ekranu okienko "COMMAND"
31f5 ldx #$b4           dopisz w okienku "LOCATE"
31f7 ldy #$5d
31f9 jsr $2197
31fc ldx #$15           drukuj okienko z nazwami postaci i tekstem
31fe ldy #$53           "WHO DO YOU WANT TO LOCATE ?"
3200 jsr $24d0          numer wybranej postaci zwr w $0913
3203 jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
3206 lda #$16           rysuj okienko nr $16
3208 jsr $1727
320b lda $090e          we pozycj lewej krawdzi tego okienka
320e clc
320f adc #$02           +2
3211 sta $0907          bdzie to pozycja X bitmapy, ktr zaraz narysujemy
3214 lda $090f          we pozycj grnej krawdzi okienka
3217 clc
3218 adc #$04           +4
321a sta $0909          bdzie to pozycja Y bitmapy, ktr zaraz narysujemy
321d lda #$e4           Przetwrz palet ($e4) na kody poszczeglnych kolorw
321f jsr $0dea
3222 lda #$01           bdzie wywietlana bitmapa nr 1
3224 jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
3227 ldx #$b7           wpisz do okienka "LOCATED <nazwa postaci>"
3229 ldy #$5d
322b jsr $148b
322e jsr $31a8          Niech X = 3 * [$0913]
3231 ldy #$01           zainicjuj offset w poziomie danej postaci wobec MK
3233 sty $32d2          na 1 (standardowo ta sama pozycja)
3236 sty $32d3          to samo zrb z offsetem w pionie
3239 lda $047a,x        we numer lokacji, w ktrej znajduje si posta
323c bne $3241          jeeli nie jest to winda -> $3241
323e jmp $32c5          jeeli winda -> $32c5
3241 sec                od numeru lokacji odejmujemy 1
3242 sbc #$01
3244 and #$07           pobieramy numer lokacji na pitrze liczc od zera
3246 sta $3252          zapisujemy go jako argument cmp (poniej)
3249 lda $090d          we numer lokacji Magic Knighta
324c sec                -1
324d sbc #$01
324f and #$07           pobieramy numer lokacji MK na pitrze liczc od zera
3251 cmp #$00           argument cmp jest ustawiany
3253 beq $3260          jeeli ten sam numer lokacji na pitrze -> $3260
3255 bcc $325d          jeeli nr lokacji postaci > nr lokacji MK -> $325d
3257 dec $32d2          zmniejsz o 1 komrk zawierajc offset w poziomie
325a jmp $3260          przeskok nastpnej instrukcji
325d inc $32d2          zwiksz o 1 komrk zawierajc offset w poziomie
3260 lda $047a,x        ponownie we numer lokacji, w ktrej jest posta
3263 sec                ponownie odejmij 1
3264 sbc #$01
3266 and #$f8           uzyskaj jej numer pitra (liczc od zera) * 8
3268 sta $3274          zapisz go jako argument cmp (poniej)
326b lda $090d          we numer lokacji Magic Knighta
326e sec                -1
326f sbc #$01
3271 and #$f8           uzyskaj numer pitra (liczc od zera) * 8
3273 cmp #$00           argument cmp jest ustawiany
3275 beq $3282          jeeli to samo pitro -> $3282
3277 bcc $327f          gdy nr pitra postaci * 8 > nr pitra MK * 8 -> $327f
3279 dec $32d3          zmniejsz o 1 komrk zawierajc offset w pionie
327c jmp $3282          przeskok nastpnej instrukcji
327f inc $32d3          zwiksz o 1 komrk zawierajc offset w pionie
3282 lda $32d2          we offset o poziomie
3285 asl @              * 2 (mog powsta wartoci: 0, 2 lub 4)
3286 clc                dodaj do lewej krawdzi okienka
3287 adc $090e
328a adc #$02           + 2
328c tax                zapisz wynik w X
328d lda $32d3          we offset w pionie
3290 asl @              * 2 (mog powsta wartoci: 0, 2 lub 4)
3291 clc                dodaj do grnej krawdzi okienka
3292 adc $090f
3295 adc #$04           + 4
3297 tay                zapisz wynik w Y - X i Y s param. dla poniszej proc.
3298 jsr $1307          Oblicz adres w pamici obr. na podstawie przesunicia
329b lda #$ec
329d jsr $0dea          Przetwrz palet ($ec) na kody poszczeglnych kolorw
32a0 ldx #$ff           inicjujemy na $ff zewntrzny licznik ptli
32a2 ldy #$00           bdziemy przeglda bajty w pamici o offsetu zerowego
32a4 lda ($cb),y        we bajt z pamici obrazu
32a6 jsr $0e15          Uwzgldnij aktualn palet kolorw
32a9 sta ($cb),y        zapisz go z powrotem
32ab iny                zwiksz Y, aby uzyska offset bajtu ssiedniego
32ac lda ($cb),y        we ssiedni bajt pamici obrazu
32ae jsr $0e15          Uwzgldnij aktualn palet kolorw
32b1 sta ($cb),y        zapisz go z powrotem
32b3 tya                offset do A
32b4 clc                dodaj $1f, aby uzyska offset bajtu pod tym pierwszym
32b5 adc #$1f
32b7 tay                offset z powrotem do Y
32b8 bne $32a4          jeeli wyszed on niezerowy -> $32a4 (kont. ptli)
32ba inc $cc            zwiksz o 1 starszy bajt adresu pamici obrazu
32bc inx                zwiksz o 1 zewntrzny licznik ptli
32bd beq $32a2          = 0 -> $32a2 (kont.) - w sumie przetworzymy 16 linii
32bf jsr $211c          Wydrukuj "Press fire to continue" i poczekaj na fire
32c2 jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr
32c5 ldx #$be           dopisz do okienka "IN THE LIFT"
32c7 ldy #$5d           (cay napis: LOCATED <nazwa postaci> IN THE LIFT)
32c9 jsr $148b
32cc dec $32d2          BD! - off. w poz. = 0 (le, gdy s w tej samej lok.)
32cf jmp $3282          skok do wyw. - BD! - dlaczego offset pionowy = 1?
32d2 dta 0, 0           offesty danej posiaci wobec MK w poziomie i w pionie

; Realizacja polecenia "COMMAND A CHARACTER"

32d4 lda $091f          Czy wolno uy polecenia "COMMAND A CHARACTER"?
32d7 and #$01
32d9 bne $32de          Z = 1 ->  tak - przeskok nastpnej instrukcji
32db jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr
32de jsr $40e6          Efekt dwikowy nr. 1
32e1 lda #$10           tekstem dodatkowym, wpisywanym po "WHO DO YOU WANT TO"
32e3 sta $092b          bdzie "COMMAND ?"
32e6 lda #$53
32e8 sta $092c
32eb ldx #$1b           wywietl list postaci, otrrz okienko "COMMAND"
32ed ldy #$5c           i wpisz do niego "COMMAND <nazwa postaci>"
32ef jsr $2436
32f2 ldx #$d1           dopisz w okienku pomocniczym " TO "
32f4 ldy #$59
32f6 jsr $2197
32f9 lda #$17           narysuj okienko nr $17 ze strzak
32fb jsr $171e
32fe ldx #$1e           wpisz do okienka tekst z nazwami polece
3300 ldy #$5c           (wypisane s pod procedur)
3302 jsr $148b
3305 jsr $1af6          zwr w A identyfikator wybranej joystickiem pozycji
3308 sec                A -= $41
3309 sbc #$41
330b sta $331d          wstaw obliczon warto jako argument dla LDA
330e tax                do X wstaw numer wybranego podpolecenia
330f jsr $2558          zapisz w $d5,6 adres pocztku nazwy tego podpolecenia
3312 ldx $d5            wczytaj adres pocztku nazwy tego podpolecenia do X, Y
3314 ldy $d6
3316 jsr $2197          wydrukuj nazw podpolecenia
3319 jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
331c lda #$00           We numer wybranego wczeniej polecenia
331e asl @              * 2
331f tax
3320 lda $332f,x        We adres procedury jego realizacji
3323 sta $332d
3326 lda $3330,x
3329 sta $332e
332c jmp $ffff          Skocz pod adres tej procedury

332f dta a($333b)       GO TO SLEEP
     dta a($336a)       WAKE UP
     dta a($3399)       GO AWAY
     dta a($3442)       HELP
     dta a($33c2)       EAT & DRINK
     dta a($340f)       BE HAPPY

; GO TO SLEEP

333b lda $0913          We numer postaci, ktrej dotyczy polecenie
333e jsr $31b4          Oblicz adres pocztku atrybutw postaci o numerze w A
3341 ldy #$06           Sprawd, czy posta pi
3343 lda ($d9),y
3345 bpl $334a          nie -> omi nastpn instrukcj
3347 jmp $2298          Drukuj tekst "GIMBAL IS ALREADY ASLEEP"
334a ldy #$02           Jeeli STAMINA jest wiksza lub rwna $46, to posta
334c lda ($d9),y        jest "TOO WAKEFUL"
334e cmp #$46
3350 bcc $3355
3352 jmp $229f          Drukuj tekst "GIMBAL IS TOO WAKEFUL TO SLEEP"
3355 dey                Jeeli HAPPINESS jest mniejsza od $1e to posta
3356 lda ($d9),y        "DOES NOT WANT"
3358 cmp #$1e
335a bcs $335f
335c jmp $22a6          Drukuj tekst "GIMBAL DOES NOT WANT TO BE COMMANDED..."
335f ldy #$06           Ustaw status postaci na "ASLEEP"
3361 lda ($d9),y
3363 ora #$80
3365 sta ($d9),y
3367 jmp $23c5          Drukuj tekst "GIMBAL HAS GONE TO SLEEP"

; WAKE UP

336a lda $0913          We numer postaci, ktrej dotyczy polecenie
336d jsr $31b4          Oblicz adres pocztku atrybutw postaci o numerze w A
3370 ldy #$06           Sprawd, czy posta pi
3372 lda ($d9),y
3374 bmi $3379          tak -> omi nastpn instrukcj
3376 jmp $22ad          Drukuj tekst "GIMBAL IS ALREADY AWAKE"
3379 ldy #$02           Jeeli STAMINA jest mniejsza od $1e to posta jest
337b lda ($d9),y        "TOO TIRED"
337d cmp #$1e
337f bcs $3384
3381 jmp $22b4          Drukuj tekst "GIMBAL IS TOO TIRED TO WAKE UP"
3384 dey                Jeeli HAPPINESS jest mniejsza od $1e to posta
3385 lda ($d9),y        "DOES NOT WANT"
3387 cmp #$1e
3389 bcs $338e
338b jmp $22a6          Drukuj tekst "GIMBAL DOES NOT WANT TO BE COMMANDED..."
338e ldy #$06           Ustaw status postaci na "AWAKE"
3390 lda ($d9),y
3392 and #$7f
3394 sta ($d9),y
3396 jmp $23cc          Drukuj tekst "GIMBAL HAS WOKEN UP"

; GO AWAY

3399 jsr $3496          Jeli posta pi -> powrt
339c lda $0913          We numer postaci, ktrej dotyczy polecenie
339f jsr $31b4          Oblicz adres pocztku atrybutw postaci o numerze w A
33a2 ldy #$02           Jeeli STAMINA jest mniejsza od $14 to posta jest
33a4 lda ($d9),y        "TOO TIRED"
33a6 cmp #$14
33a8 bcs $33ad
33aa jmp $22bb          Drukuj tekst "GIMBAL IS TOO TIRED TO GO AWAY"
33ad dey                Jeeli HAPPINESS jest mniejsza od $14 to posta
33ae lda ($d9),y        "DOES NOT WANT"
33b0 cmp #$14
33b2 bcs $33b7
33b4 jmp $22a6          Drukuj tekst "GIMBAL DOES NOT WANT TO BE COMMANDED..."
33b7 jsr $31a8          Niech X = 3 * [$0913]
33ba lda #$63           Postaci nie bdzie nigdzie ($63 - numer lokacji)
33bc sta $047a,x
33bf jmp $23d3          Drukuj tekst "GIMBAL HAS GONE AWAY"

; EAT & DRINK

33c2 jsr $3496          Jeli posta pi -> powrt
33c5 lda $0913          We numer postaci, ktrej dotyczy polecenie
33c8 jsr $31b4          Oblicz adres pocztku atrybutw postaci o numerze w A
33cb ldy #$04           we ilo jedzenia jaka jeszcze pozostaa
33cd lda ($d9),y
33cf bne $33d4          jeeli niezerowa -> $33d4
33d1 jmp $22d0          Drukuj tekst "GIMBAL HAS NO FOOD LEFT"
33d4 ldy #$02           Jeeli STAMINA jest mniejsza od $14 to posta jest
33d6 lda ($d9),y        "TOO TIRED"
33d8 cmp #$14
33da bcs $33df
33dc jmp $22d7          Drukuj tekst "GIMBAL IS TOO TIRED TO EAT OR DRINK"
33df dey                Jeeli HAPPINESS jest mniejsza od $1e to posta
33e0 lda ($d9),y        "DOES NOT WANT"
33e2 cmp #$1e
33e4 bcs $33e9
33e6 jmp $22a6          Drukuj tekst "GIMBAL DOES NOT WANT TO BE COMMANDED..."
33e9 ldy #$00           we STRENGTH postaci
33eb lda ($d9),y
33ed cmp #$64           jeeli jest ona rna od $64 (maksymalnej wartoci)
33ef bne $33f4          to skok do $33f4
33f1 jmp $23da          Drukuj tekst "GIMBAL HAS TAKEN REFRESHMENT"
33f4 ldy #$04           zmniejszenie iloci jedzenia o 1
33f6 lda ($d9),y
33f8 sec
33f9 sbc #$01
33fb sta ($d9),y        zapamitanie tej iloci
33fd ldy #$00           we STRENGTH postaci
33ff lda ($d9),y
3401 clc
3402 adc #$01           + 1
3404 sta ($d9),y        zapamitaj now warto STRENGTH
3406 ldy #$04           ponowne pobranie iloci jedzenia
3408 lda ($d9),y
340a bne $33e9          jeeli jeszcze co zostao -> $33e9 (ponowne jedzenie)
340c jmp $23da          Drukuj tekst "GIMBAL HAS TAKEN REFRESHMENT"

; BE HAPPY

340f jsr $3496          Jeli posta pi -> powrt
3412 lda $0913          We numer postaci, ktrej dotyczy polecenie
3415 jsr $31b4          Oblicz adres pocztku atrybutw postaci o numerze w A
3418 ldy #$02           Jeeli STAMINA jest mniejsza od $1e to posta jest
341a lda ($d9),y        "TOO TIRED"
341c cmp #$1e
341e bcs $3423
3420 jmp $22de          Drukuj tekst "GIMBAL IS TOO TIRED TO BE HAPPY"
3423 dey                Jeeli HAPPINESS jest mniejsza od $05 to posta
3424 lda ($d9),y        "DOES NOT WANT"
3426 cmp #$05
3428 bcs $342d
342a jmp $22a6          Drukuj tekst "GIMBAL DOES NOT WANT TO BE COMMANDED..."
342d ldx $0913          We numer postaci, ktrej dotyczy polecenie
3430 lda $343a,x        We maksymaln HAPPINESS dla tej postaci
3433 ldy #$01           i ustaw j
3435 sta ($d9),y
3437 jmp $23e1          Drukuj tekst "GIMBAL WILL TRY TO BE HAPPY"

343a dta $64           HAPPINESS Gimbala
     dta $46           HAPPINESS Thora
     dta $50           HAPPINESS Florina
     dta $28           HAPPINESS Orika
     dta $32           HAPPINESS Samsuna
     dta $62           HAPPINESS Elranda
     dta $5a           HAPPINESS Rosmar
     dta $00           HAPPINESS Banshee

; HELP

3442 jsr $3496          Jeli posta pi -> powrt
3445 lda #$20           Ewentualny komunikat bdzie brzmia
3447 sta $5d53          "CANNOT HELP YOU " (wstawienie spacji za "YOU")
344a lda $0913          Jeeli to Banshee -> skok do miejsca, gdzie wybierana
344d cmp #$07           jest odpowiednia procedura
344f beq $3472
3451 jsr $31b4          Oblicz adres pocztku atrybutw postaci o numerze w A
3454 ldy #$05           we HELP STATUS postaci
3456 lda ($d9),y
3458 bne $345d          (> 0 - posta ma niezbdny przedmiot) -> $345d
345a jmp $22c2          Drukuj tekst "GIMBAL CANNOT HELP YOU"
345d ldy #$02           Jeeli STAMINA jest mniejsza od $0a to posta jest
345f lda ($d9),y        "TOO TIRED"
3461 cmp #$0a
3463 bcs $3468          jeli nie -> przeskok dalej
3465 jmp $22c9
3468 dey                Jeeli HAPPINESS jest mniejsza od $0a to posta
3469 lda ($d9),y        "DOES NOT WANT"
346b cmp #$0a
346d bcs $3472
346f jmp $22a6          Drukuj tekst "GIMBAL DOES NOT WANT TO BE COMMANDED..."
3472 lda $0913          we numer postaci
3475 asl @              * 2
3476 tax
3477 lda $3486,x        we modszy bajt procedury realizacji
347a sta $3484
347d lda $3487,x        we starszy bajt procedury realizacji
3480 sta $3485
3483 jmp $ffff          skocz do odpowiedniej procedury

3486 dta a($34b7)       Pomoc Gimbala
     dta a($34ba)       Pomoc Thora
     dta a($3504)       Pomoc Florina
     dta a($3530)       Pomoc Orika
     dta a($3533)       Pomoc Samsuna
     dta a($3579)       Pomoc Elranda
     dta a($35c4)       Pomoc Rosmar
     dta a($35f8)       Pomoc Banshee

; Sprawd, czy posta o numerze w [$0913] pi. Jeli nie, nie rb nic.
; Jeli tak, drukuj komunikat i wyskocz z procedury woajcej.

3496 lda $0913          we numer postaci, ktrej dotyczy polecenie
3699 jsr $31b4          Oblicz adres pocztku atrybutw postaci o numerze w A
349c ldy #$06           sprawd, czy posta pi
349e lda ($d9),y
34a0 bpl $34b6          nie -> rts
34a2 lda #$22           otwrz okienko nr. $22
34a4 jsr $1727
34a7 ldx #$61           drukuj "... IS ASLEEP"
34a9 ldy #$51
34ab jsr $148b
34ae jsr $211c          Wydrukuj "Press fire to continue" i poczekaj na fire
34b1 pla                zdejmij adres powrotu do procedury woajcej
34b2 pla
34b3 jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr
34b6 rts

; Pomoc Gimbala

34b7 jmp $22c2          Drukuj tekst "GIMBAL CANNOT HELP YOU"

; Pomoc Thora

34ba lda #$a9           Ewentualny komunikat bdzie brzmia
34bc sta $5d53          "CANNOT HELP YOU HERE" (wstawienie HERE)
34bf lda $090d          czy Magic Knight znajduje si w windzie?
34c2 bne $34dc          nie -> drugi rodzaj pomocy ($34dc)
34c4 lda $093a          sprawd, czy MK prosi ju o pomoc Thora w windzie
34c7 and #$01
34c9 bne $34fb          tak -> $34fb
34cb lda $093a          zaznacz sobie, e pomoc zostaa ju udzielona
34ce ora #$01
34d0 sta $093a
34d3 ldx #$d9           drukuj: "THOR SMASHED THE LIFT CONTROL BOX..."
34d5 ldy #$53           i poczekaj na fire
34d7 lda #$18
34d9 jmp $2401
34dc cmp #$09           czy Magic Knight znajduje si w wiey (TOWER)?
34de beq $34e3          tak -> $34e3
34e0 jmp $22c2          Drukuj tekst "GIMBAL CANNOT HELP YOU"
34e3 lda $093a          sprawd, czy MK prosi ju o pomoc Thora w/s wiey
34e6 and #$02
34e8 bne $34fb          tak -> $34fb
34ea lda $093a          zaznacz, e Thor udzieli ju pomocy w wiey
34ed ora #$02
34ef sta $093a
34f2 ldx #$20           drukuj tekst "THE TOWER SHOOK AS THOR SEND A BOLT..."
34f4 ldy #$54
34f6 lda #$18
34f8 jmp $2401
34fb ldx #$b7           drukuj tekst "THERE IS NOTHING MORE THAT ... HELP YOU"
34fd ldy #$53
34ff lda #$18
3501 jmp $2401

; Pomoc Florina

3504 lda #$5c           Czy Florin ma Tube Of Glue?
3506 sta $e1            ($045c - pocztek stanu posiadania Florina)
3508 lda #$04
350a sta $e2
350c lda #$0a
350e jsr $18f0
3511 beq $3516          ma -> dalej
3513 jmp $22c2          Drukuj tekst "GIMBAL CANNOT HELP YOU"
3516 lda #$0b           Czy Florin ma Broken Talisman?
3518 jsr $18f0
351b bne $3513          nie ma -> CANNOT HELP
351d lda #$0b           Usu "BROKEN TALISMAN" ze stanu posiadania Florina
351f jsr $3049
3522 lda #$0c           Wstaw "MAGIC TALISMAN" do stanu posiadania Florina
3524 jsr $2d86
3527 ldx #$ab           Drukuj "SHAKING AND NOISE. FLORIN HAS MENDED..."
3529 ldy #$54
352b lda #$18
352d jmp $2401

; Pomoc Orika

3530 jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr

; Pomoc Samsuna

3533 lda #$a9           Ewentualny komunikat bdzie brzmia
3535 sta $5d53          "CANNOT HELP YOU HERE" (wstawienie HERE)
3538 lda $090d          czy Magic Knight znajduje si w lokacji "THE PIT"?
353b cmp #$2e
353d beq $3542          tak -> $3542
353f jmp $22c2          Drukuj tekst "GIMBAL CANNOT HELP YOU"
3542 lda $093a          sprawd, czy Samsun udzieli ju pomocy
3545 and #$10
3547 beq $354c          nie -> $354c
3549 jmp $34fb          do procedury drukujcej, e nie mona udzieli pomocy
354c lda $093a          zaznacz, e Samsun udzieli pomocy w "THE PIT"
354f ora #$10
3551 sta $093a
3554 lda #$66           ustaw $e1,2 na pocztek stanu posiadania SAMSUNA
3556 sta $e1            ($0466)
3558 lda #$04
355a sta $e2
355c lda #$1d           usu PLATFORM ze stanu posiadania SAMSUNA
355e jsr $3049
3561 lda #$2e           PLATFORM'a bdzie si teraz znajdowaa w lokacji
3563 sta $04e9          $2e (THE PIT)
3566 lda #$0f           a jej wsprzdnymi bdzie ($0f, $0b)
3568 sta $04ea
356b lda #$0b
356d sta $04eb
3570 ldx #$0a           drukuj "GOOG OLD SAMSUN HAS THROWN A PLATFORM..."
3572 ldy #$55
3574 lda #$18
3576 jmp $2401

; Pomoc Elranda

3579 lda #$a9           Ewentualny komunikat bdzie brzmia
357b sta $5d53          "CANNOT HELP YOU HERE" (wstawienie HERE)
357e lda $090d          czy Magic Knight znajduje si w lokacji "THE WALL"?
3581 cmp #$1d
3583 beq $3588          tak -> 3588
3585 jmp $22c2          Drukuj tekst "GIMBAL CANNOT HELP YOU"
3588 lda #$aa           Ewentualny komunikat bdzie brzmia
358a sta $5d53          "CANNOT HELP YOU YET" (wstawienie YET)
358d lda $093a          sprawdzenie, czy Elrand pomg ju w "THE WALL"
3590 and #$08
3592 beq $3597          nie -> $3597
3594 jmp $34fb          do procedury drukujcej, e nie mona udzieli pomocy
3597 lda $093a          sprawd, czy MK prosi o pomoc Thora w wiey
359a and #$02
359c bne $35a1          tak -> $35a1
359e jmp $22c2          Drukuj tekst "GIMBAL CANNOT HELP YOU"
35a1 lda $093a          zaznacz, e Elrand udzieli ju pomocy w "THE WALL"
35a4 ora #$08
35a6 sta $093a
35a9 lda #$c9           zmie adres danych lokacji "THE WALL" na $76c9
35ab sta $7187          (bdzie miaa wyrw w murze)
35ae lda #$76
35b0 sta $7188
35b3 lda #$1d           odblokuj w tablicy rozmieszczenia przedmiotw
35b5 sta $04dd          dwa obiekty "LUMP OF BRICKWORK"
35b8 sta $0516
35bb ldx #$46           drukuj tekst "THE TRUMPET BLOWS AND THE WALL COMES..."
35bd ldy #$55
35bf lda #$18
35c1 jmp $2401

; Pomoc Rosmar

35c4 lda #$a9           Ewentualny komunikat bdzie brzmia
35c6 sta $5d53          "CANNOT HELP YOU HERE" (wstawienie HERE)
35c9 lda $090d          sprawd, czy MK znajduje si w "MAGIC TUNNEL ENTRANCE"
35cc cmp #$2a
35ce beq $35d3          tak -> $35d3
35d0 jmp $22c2          Drukuj tekst "GIMBAL CANNOT HELP YOU"
35d3 lda $77e2          sprawdzenie w danych planszy, czy pionowa ciana
35d6 cmp #$07           zostaa ju wczeniej wyburzona
35d8 bne $35dd          tak -> $35dd (wyburzanie)
35da jmp $34fb          do procedury drukujcej, e nie mona udzieli pomocy
35dd lda #$07           modyfikacja danych planszy w taki sposb, e pionowa
35df sta $77e2          ciana jest krtsza i umoliwia przejcie MK
35e2 lda #$75           Ustaw $e1,2 na pocztek stanu posiadania Banshee
35e4 sta $e1            ($0475) - BD! - powinien to by stan Rosmar
35e6 lda #$04           ($0470)
35e8 sta $e2
35ea lda #$12           Usu "FAST BLOW FUSE" ze stanu posiadania ROSMAR
35ec jsr $3049
35ef ldx #$76           drukuj tekst "ROSMAR PLACED THE FUSE IN THE LASER..."
35f1 ldy #$55
35f3 lda #$18
35f5 jmp $2401

; Pomoc Banshee

35f8 lda random         We liczb (do X) z przedziau [0..7]
35fb and #$07
35fd tax
35fe lda #$df
3600 ldy #$55
3602 jsr $2543          We X-ty komunikat zapisany od adresu $55df
3605 ldx $d5            We obliczony adres komuniaktu
3607 ldy $d6
3609 lda #$18           Wydrukuj go w okienku nr. $18 i poczekaj na fire
360b jmp $2401

; Realizacja polecenia "CAST A SPELL"

360e lda $091f          czy wolno jest uy tego polecenia
3611 and #$20           (Magic Knight ma przedmiot, ktry ma MAGIC POWER)
3613 bne $3618          tak -> przeskocz nastpn instrukcj
3615 jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr
3618 jsr $40e6          Efekt dwikowy nr. 1
361b jsr $2135          otwrz u dou ekranu okienko "COMMAND"
361e ldx #$68           dopisz w okienku "CAST A SPELL"
3620 ldy #$67
3622 jsr $2197
3625 lda $676d          ustaw pozycj dolnej krawdzi okienka, ktre
3628 sta $4b9e          za chwil narysujemy na $0b
362b lda #$1e           narysuj okienko ze strzak o numerze $1e
362d jsr $171e
3630 ldx #$6e           drukuj w okienku "WHICH SPELL DO YOU WANT TO CAST?"
3632 ldy #$67
3634 jsr $148b
3637 jsr $1af6          zwr w A identyfikator wybranej joystickiem pozycji
363a sec                A - litera przyporzdkowana czarowi
363b sbc #$41           oblicz numer czaru i przechowaj go jako operand
363d sta $365c          instrukcji LDA znajdujcej si poniej
3640 cmp #$04           jeeli jest to czar PROJECT PHYSICAL BODY
3642 beq $365b          to na razie nie otwieraj okienka "COMMAND"
3644 jsr $2135          otwrz u dou ekranu okienko "COMMAND"
3647 lda #$91           $6a91 - tablica nazw czarw
3649 ldy #$6a
364b ldx $365c          X = numer czaru
364e jsr $2543          przeskocz do pocztku nazwy czaru o numerze w X
3651 ldx $d5            wydrukuj nazw rzucanego czaru w okienku pomocniczym
3653 ldy $d6
3655 jsr $2197
3658 jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
365b lda #$00           operand LDA jest numerem czaru
365d asl @              A * 2 jest indeksem w tablicy adresw procedur
365e tax                realizacji czarw
365f lda $366e,x
3662 sta $366c
3665 lda $366f,x
3668 sta $366d
366b jmp $ffff          Skok do procedury realizacji czaru

366e dta a($367c)       czar "CRYSTALLIUM SPECTRALIS"
     dta a($36ba)       czar "CANDELIUM ILLUMINATUS"
     dta a($370f)       czar "ARMOURIS PHOTONICUS"
     dta a($3762)       czar "FUMATICUS PROTECTIUM"
     dta a($379a)       czar "PROJECT PHYSICAL BODY"
     dta a($3804)       czar "RELEASE SPELL"
     dta a($3837)       czar "QUITICUS GAMUS"

; Realizacja czaru "CRYSTALLIUM SPECTRALIS"

367c lda $0916          sprawd, czy rzucono wszystkimi trzema krysztaami
367f and #$01           w GIMBALLA
3681 beq $3686          nie -> $3686
3683 jmp $236f          Drukuj tekst "GIMBAL IS ALREADY FREE"
3686 lda $090d          Czy lokacja Magic Knighta jest taka sama, jak
3689 cmp $047a          lokacja Gimbala?
368c beq $3691          tak -> przeskocz nastpn instrukcj
368e jmp $234c          Drukuj tekst "THAT SPELL CANNOT YET BE CAST..."
3691 cmp $0483          Czy nr lokacji MK jest taki sam, jak nr lokacji Orika?
3694 bne $368e          nie -> czar nie moe by rzucony
3696 lda #$61           Czy Orik ma Crystal Ball?
3698 sta $e1
369a lda #$04
369c sta $e2
369e lda #$06
36a0 jsr $18f0
36a3 bne $368e          nie ma -> $368e (nie mona rzuci czaru)
36a5 lda #$20           Czy Magic Knight ma White Gold Ring?
36a7 jsr $18eb
36aa bne $368e          nie ma -> $368e (nie mona rzuci czaru)
36ac jsr $4199          szybkie miganie ramk obrazu (rzucanie czaru)
36af lda $093b          odnotuj drugi raz, e rzucono ten czar
36b2 ora #$01           (sprawdzane przy obliczaniu PROGRESS)
36b4 sta $093b
36b7 jmp $2353          Drukuj tekst "THE SPELL HAS WORKED!..."

; Realizacja czaru "CANDELIUM ILLUMINATUS"

36ba lda $0915          czy ten czar by rzucany?
36bd and #$02
36bf beq $36c4          nie -> przeskocz nastpn instrukcj
36c1 jmp $2376          Drukuj tekst "THE CANDLE IS ALREADY ALIGHT"
36c4 lda $04e3          czy lokacja Magic Knighta jest taka sama, jak lokacja
36c7 cmp $090d          przedmiotu "FOUR LEAF CLOVER"?
36ca beq $36cf          tak -> przeskocz nastpn instrukcj
36cc jmp $234c          Drukuj tekst "THAT SPELL CANNOT YET BE CAST..."
36cf lda #$21           Czy Magic Knight ma Engraved Candle?
36d1 jsr $18eb
36d4 bne $36cc          nie ma -> $36cc (nie mona rzuci czaru)
36d6 jsr $4199          szybkie miganie ramk obrazu (rzucanie czaru)
36d9 lda #$2f           Czy Magic Knight ma Shield?
36db jsr $18eb
36de bne $36f3          nie ma -> $36f3 (wypisz tekst i zakocz gr)
36e0 lda $0915          czar zostaje odnotowany jako rzucony
36e3 ora #$02
36e5 sta $0915
36e8 lda $093b          odnotuj drugi raz, e rzucono ten czar
36eb ora #$02           (sprawdzane przy obliczaniu PROGRESS)
36ed sta $093b
36f0 jmp $2361          Drukuj tekst "WELL DONE, THE CANDLE IS NOW GLOWING..."

; Procedura wypisuje tekst, ktry mwi, e nie udao si rzuci czaru
; "CANDELIUM ILLUMINATUS" i koczy gr

36f3 lda $67e9          we bajt poprzedzajcy tekst, ktry za chwil wydruk.
36f6 sta $4bc6          jest to pozycja dolnej krawdzi okienka nr $23
36f9 lda #$23           rysuj okienko nr $23
36fb jsr $1727
36fe ldx #$ea           wydrukuj tekst "BOOOOOMMM ..."
3700 ldy #$67
3702 jsr $148b
3705 jsr $211c          Wydrukuj "Press fire to continue" i poczekaj na fire
3708 ldx #$81           drukuj "YOU BLEW YOURSELF UP" i zakocz gr
370a ldy #$6a
370c jmp $2c49

; Realizacja czaru "ARMOURIS PHOTONICUS"

370f lda $0915          czy ten czar by rzucany?
3712 and #$04
3714 beq $3719          nie -> przeskocz nastpn instrukcj
3716 jmp $237d          Drukuj tekst "YOUR ARMOUR IS GLOWING ALREADY"
3719 lda $090d          czy lokacja Magic Knighta jest taka sama, jak lokacja
371c cmp $04f8          "STRANGE LIQUID"?
371f beq $3724          tak -> przeskocz nastpn instrukcj
3721 jmp $234c          Drukuj tekst "THAT SPELL CANNOT YET BE CAST..."
3724 jsr $2d67          Przetwrz pozycj Magic Knighta na kratkow
3727 lda $2d80          we pozycj Y Magic Knighta
372a cmp $04fa          czy jest taka sama, jak pozycja Y "STRANGE LIQUID"
372d bne $3721          nie -> "THAT SPELL CANNOT YET BE CAST..."
372f ldx $04f9          we pozycj X "STRANGE LIQUID"
3732 dex                - 1
3733 cpx $2d7f          czy wynik jest rwny pozycji X Magic Knighta?
3736 beq $3744          tak -> skok do realizacji czaru
3738 inx                odtwrz pozycj X "STRANGE LIQUID"
3739 cpx $2d7f          czy jest rwna pozycji X Magic Knighta?
373c beq $3744          tak -> skok do realizacji czaru
373e inx                X = pozycja X "STRANGE LIQUID" + 1
373f cpx $2d7f          czy jest to rwne pozycji X Magic Knighta?
3742 bne $3721          nie -> "THAT SPELL CANNOT YET BE CAST..."
3744 lda $0915          czar zostaje odnotowany jako rzucony
3747 ora #$04
3749 sta $0915
374c jsr $4199          szybkie miganie ramk obrazu (rzucanie czaru)
374f lda $093b          odnotuj drugi raz, e rzucono ten czar
3752 ora #$04           (sprawdzane przy obliczaniu PROGRESS)
3754 sta $093b
3757 lda #$63           usu "STRANGE LIQUID"
3759 sta $04f8
375c jsr $3941          Zmiana wygldu Magic Knighta na jasny
375f jmp $2368          Drukuj tekst "THE LIQUID TURNED TO A VAPOUR..."

; Realizacja czaru "FUMATICUS PROTECTIUM"

3762 lda $0916          czy ten czar by rzucany?
3765 and #$02
3767 beq $376c          nie -> przeskocz nastpn instrukcj
3769 jmp $2384          Drukuj tekst "YOU HAVE ALL THE PROTECTION..."
376c lda $0925          Czy zostao jeszcze 48 godzin czasu gry?
376f cmp #$30
3771 bne $3776          nie -> przeskocz nastpn instrukcj
3773 jmp $234c          Drukuj tekst "THAT SPELL CANNOT YET BE CAST..."
3776 lda #$2e           Czy Magic Knight ma Power-Pong Plant?
3778 jsr $18eb
377b bne $3773          nie ma
377d lda #$13           Czy Magic Knight ma Red Herring?
377f jsr $18eb
3782 bne $3773          nie ma
3784 jsr $4199          szybkie miganie ramk obrazu (rzucanie czaru)
3787 lda $0916          czar zostaje odnotowany jako rzucony
378a ora #$02
378c sta $0916
378f lda $093b          odnotuj drugi raz, e rzucono ten czar
3792 ora #$08           (sprawdzane przy obliczaniu PROGRESS)
3794 sta $093b
3797 jmp $238b          Drukuj tekst "THE FUMES FROM THE PLANT & FISH..."

; Realizacja czaru "PROJECT PHYSICAL BODY"

379a jsr $2135          otwrz u dou ekranu okienko "COMMAND"
379d ldx #$a1           dopisz w okienku "PROJECT PHYSICAL BODY TO"
379f ldy #$6a
37a1 jsr $2197
37a4 ldx #$24           drukuj okienko z nazwami postaci i tekstem:
37a6 ldy #$53           "WHO DO YOU WANT TO TRAVEL TO ?"
37a8 jsr $24d0          numer wybranej postaci zwr w $0913
37ab jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
37ae lda #$06           Czy Magic Knight ma Crystal Ball?
37b0 jsr $18eb
37b3 beq $37b8          ma -> przeskocz nastpn instrukcj
37b5 jmp $234c          Drukuj tekst "THAT SPELL CANNOT YET BE CAST..."
37b8 lda #$0c           Czy Magic Knight ma Magic Talisman?
37ba jsr $18eb
37bd bne $37b5          nie ma -> czar nie moe by rzucony
37bf lda $0913          we numer postaci, ktrej dotyczy czar
37c2 sta $37c8          wstaw jako argument do 'adc'
37c5 asl @              * 2
37c6 clc
37c7 adc #$00           A = numer postaci * 3
37c9 tax
37ca lda $090d          we numer lokacji Magic Knighta
37cd cmp $047a,x        czy jest taka sama, jak lokacja wybranej postaci?
37d0 beq $37b5          tak -> "THAT SPELL CANNOT YET BE CAST..."
37d2 lda $047a,x        czy lokacja postaci jest rwna $63 (zrobiono GO AWAY)
37d5 cmp #$63
37d7 beq $37b5          tak -> "THAT SPELL CANNOT YET BE CAST..."
37d9 cmp #$64           czy lokacja postaci jest rwna $64 (posta odesano)?
37db beq $37b5          tak -> $3b55 ("THE SPELL CANNOT ... ")
37dd sta $090d          niech lokacja MK bdzie taka, jak lokacja postaci
37e0 lda $047b,x        we pozycj X postaci
37e3 clc                +2
37e4 adc #$02
37e6 asl @              *8
37e7 asl @
37e8 asl @
37e9 sta $0448          bdzie to nastpna pozycja X MK w pikselach trybu 8
37ec sta $0445          zapisz A jako akt. poz. X MK w pikselach trybu gr. 8
37ef lda $047c,x        we pozycj Y postaci
37f2 asl @              *8
37f3 asl @
37f4 asl @
37f5 clc                +1, bo pozycja Y MK jest zawsze wielokrotnoci 8 + 1
37f6 adc #$01
37f8 sta $0449          bdzie to nastpna pozycja Y Magic Knighta
37fb sta $0446          zapisz jako aktualn pozycj Y MK
37fe jsr $4199          szybkie miganie ramk obrazu (rzucanie czaru)
3801 jmp $2392          Drukuj tekst "YOUR SPIRIT FLOWS THROUGH THE GATES..."

; Realizacja czaru "RELEASE SPELL"

3804 lda $093b          we zawart. komrki , w ktrej pamitamy rzucone czary
3807 cmp #$0f           sprawd, czy rzucono cztery pierwsze czary z listy
3809 beq $380e          tak -> $380e (przeskocz nastpn instrukcj)
380b jmp $234c          Drukuj tekst "THAT SPELL CANNOT YET BE CAST..."
380e lda $0916          sprawd, czy rzucono wszystkimi trzema krysztaami
3811 and #$01           w GIMBALLA
3813 beq $380b          nie -> $380b (SPELL CANNOT BE CAST)
3815 lda #$0c           Czy Magic Knight ma Magic Talisman?
3817 jsr $18eb
381a bne $380b          nie ma -> czaru nie mona rzuci
381c lda #$20           Czy Magic Knight ma White Gold Ring?
381e jsr $18eb
3821 bne $380b          nie ma -> czaru nie mona rzuci
3823 lda $093b          odnotuj drugi raz, e rzucono ten czar
3826 ora #$10           (sprawdzane przy obliczaniu PROGRESS)
3828 sta $093b
382b jsr $4199          szybkie miganie ramk obrazu (rzucanie czaru)
382e lda #$1e           drukuj "GIMBAL WILL NOW SEND EACH CHARACTER..."
3830 ldx #$ae
3832 ldy #$6a
3834 jmp $2401

; Realizacja czaru "QUITICUS GAMUS"

3837 jsr $4199          szybkie miganie ramk obrazu (rzucanie czaru)
383a ldx #$0f           drukuj "I SUPPOSE YOU REALIZED THAT QUITICUS..."
383c ldy #$51           i zakocz gr
383e jmp $2c49

; Realizacja polecenia "GIVE OBJECT"

3841 jsr $40e6          Efekt dwikowy nr. 1
3844 jsr $31c9          Ustaw $e1,2 na adres stanu posiadania Magic Knighta
3847 lda #$c8           Otwrz okienko z list przedmiotw oraz okienko
3849 sta $092b          "COMMAND", do ktrego wpisz "GIVE" (adres: $59cf).
384c lda #$59           Lista przedmiotw ma zosta poprzedzona tekstem
384e sta $092c          "GIVE WHICH OBJECT ?" (adres: $59c8)
3851 ldx #$cf
3853 ldy #$59
3855 jsr $2567          skok do procedury wywietlajcej okienko
3858 jsr $2f77          wpisz nazw wybranego przedmiotu do okienka "COMMAND"
385b ldx #$d1           dopisz w okienku pomocniczym " TO "
385d ldy #$59
385f jsr $2197
3862 lda #$00           tekstem dodatkowym, wpisywanym po "WHO DO YOU WANT TO"
3864 sta $092b          bdzie "GIVE AN OBJECT TO ?"
3867 lda #$53
3869 sta $092c
386c ldx #$00           wywietl list postaci, ale nie otwieraj okienka
386e ldy #$00           "COMMAND" (X = Y = 0)
3870 jsr $2436          (i wstaw do $0913 numer postaci)
3873 jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
3876 lda $0913          we numer wybranej postaci
3879 jsr $31d2          oblicz w $e1,2 adres pocztku jej stanu posiadania
387c ldy #$04           czy pity bajt opisu stanu posiadania wybranej
387e lda ($e1),y        postaci jest rwny 0?
3880 beq $3885          tak -> przeskocz nastpn instrukcj
3882 jmp $2283          Drukuj tekst "GIMBAL'S HANDS ARE FULL"
3885 lda $0913          we numer postaci, ktrej dotyczy polecenie
3888 jsr $31b4          Oblicz adres pocztku atrybutw postaci o numerze w A
388b ldy #$00           we STRENGTH postaci
388d lda ($d9),y
388f jsr $2d9e          skok do rodka procedury sprawdzajcej si postaci
3892 bcc $3897          C = 0 -> $3897 (pozostaa sia jest wystarczajca)
3894 jmp $228a          Drukuj tekst "GIMBAL IS NOT STRONG ENOUGH"
3897 jsr $3932          wpisz do A HAPPINESS postaci, ktrej dotyczy polecenie
389a cmp #$19           jeeli jest ona wiksza lub rwna od $19,
389c bcs $38a1          to skok do $38a1
389e jmp $2291          Drukuj tekst "GIMBAL DOES NOT WANT THAT YET"
38a1 ldx $2d66          we numer przedmiotu (ustawia go procedura $2f77)
38a4 lda $0913          we numer postaci, ktrej dotyczy polecenie
38a7 bne $38b8          jeeli nie jest to GIMBALL -> $38b8
38a9 cpx #$18           czy przedmiotem jest "WILLOW ROD"?
38ab bne $38b5          nie -> $38b5
38ad lda $040a          ustaw HELP status Gimballa na warto > 0
38b0 ora #$01           (posta bdzie moga w przyszoci pomaga)
38b2 sta $040a
38b5 jmp $3920          skok do fragmentu bdcego realizacj polecenia
38b8 cmp #$01           czy postaci jest Thor?
38ba bne $38d0          nie -> $38d0
38bc cpx #$03           czy przedmiotem jest "MIOLNIR"?
38be bne $38cd          nie -> $38cd
38c0 lda $0412          ustaw HELP status Thora na warto > 0
38c3 ora #$01           (posta bdzie moga w przyszoci pomaga)
38c5 sta $0412
38c8 lda #$0a           ustaw numer tekstu dodatkowego Thora, wypisywanego
38ca sta $0414          podczas polecenia EXAMINE na "THOR IS READY TO HELP"
38cd jmp $3920          skok do fragmentu bdcego realizacj polecenia
38d0 cmp #$02           czy postaci jest Florin?
38d2 bne $38e3          nie -> $38e3
38d4 cpx #$0b           czy przedmiotem jest BROKEN TALISMAN?
38d6 bne $38e0          nie -> $38e0
38d8 lda $041a          ustaw HELP status Florina na warto > 0
38db ora #$01           (posta bdzie moga w przyszoci pomaga)
38dd sta $041a
38e0 jmp $3920          skok do fragmentu bdcego realizacj polecenia
38e3 cmp #$03           czy postaci jest Orik?
38e5 bne $38ea          nie -> $38ea
38e7 jmp $3920          skok do fragmentu bdcego realizacj polecenia
38ea cmp #$04           czy postaci jest Samsun?
38ec bne $38fd          nie -> $38fd
38ee cpx #$08           czy przedmiotem jest JAVELIN?
38f0 bne $38fa          nie -> $38fa
38f2 lda $042a          ustaw HELP status Samsuna na warto > 0
38f5 ora #$01           (posta bdzie moga w przyszoci pomaga)
38f7 sta $042a
38fa jmp $3920          skok do fragmentu bdcego realizacj polecenia
38fd cmp #$05           czy postaci jest Elrand?
38ff bne $3910          nie -> $3910
3901 cpx #$28           czy przedmiotem jest TRUMPET?
3903 bne $390d          nie -> $390d
3905 lda $0432          ustaw HELP status Elranda na warto > 0
3908 ora #$01           (posta bdzie moga w przyszoci pomaga)
390a sta $0432
390d jmp $3920          skok do fragmentu bdcego realizacj polecenia
3910 cmp #$06           czy postaci jest Rosmar?
3912 bne $3920          nie -> $3920
3914 cpx #$24           czy przedmiotem jest POCKET LASER?
3916 bne $3920          nie -> $3920
3918 lda $043a          ustaw HELP status Rosmar na warto > 0
391b ora #$01           (posta bdzie moga w przyszoci pomaga)
391d sta $043a
3920 lda $2d66          we numer przedmiotu, ktrego dotyczy polecenie
3923 jsr $2d86          wstaw do stanu posiadania o adr. $e1,2 ten przedmiot
3926 jsr $31c9          Ustaw $e1,2 na adres stanu posiadania Magic Knighta
3929 lda $2d66          we numer przedmiotu, ktrego dotyczy polecenie
392c jsr $3044          usu ze stanu posiadania MK przedmiot o numerze w A
392f jmp $2d4d          wywietl "YOU ARE NOW CARRYING ..." i zakocz obsug

; Odczytaj do A HAPPINESS postaci o numerze podanym w $0913

3932 lda $0913          we numer postaci, ktrej dotyczy dane polecenie
3935 jsr $31b4          Oblicz adres pocztku atrybutw postaci o numerze w A
3938 ldy #$01           we HAPPINESS tej postaci
393a lda ($d9),y
393c rts

; Procedura o dwch wejciach dokonujca zmiany wygldu Magic Knighta.
; $393d - zmiana wygldu na normalny
; $3941 - zmiana wygldu na jasny (jak po rzuceniu "ARMOURIS PHOTONICUS")

393d lda #$0a           wejcie nr. 1
393f bne $3943          (jmp)

3941 lda #$05           wejcie nr. 2
3943 cmp $8004          jeeli A <> [$8004], to trzeba dokona wymiany kolorw
3946 bne $3949          skok do waciwej procedury
3948 rts
3949 lda $0e10          aktualna paleta kolorw na stos
394c pha
394d lda #$d8           Wymiana koloru nr. 1 z kolorem nr. 2 (liczc od 0)
394f jsr $0dea          Przetwrz palet ($d8) na kody poszczeglnych kolorw
3952 lda #$00           [$30,1] = $8000
3954 sta $30
3956 lda #$80
3958 sta $31
395a ldy #$00
395c lda ($30),y        we bajt
395e jsr $0e15          Uwzgldnij aktualn palet kolorw
3961 sta ($30),y        zapisz bajt
3963 iny
3964 bne $395c          do koca strony
3966 inc $31            nastpna strona
3968 lda $31            czy przekonwertowano ju $8000 - $81ff?
396a cmp #$82
396c bne $395c          nie -> kontynuuj
396e pla                odtwrz ze stosu aktualn palat kolorw
396f jsr $0dea          Przetwrz palet na kody poszczeglnych kolorw
3972 rts

; Realizacja polecenia "TAKE OBJECT"

3973 jsr $40e6          Efekt dwikowy nr. 1
3976 lda #$f8           tekstem dodatkowym, wpisywanym po "WHO DO YOU WANT TO"
3978 sta $092b          bdzie "TAKE AN OBJECT FROM ?"
397b lda #$52
397d sta $092c
3980 ldx #$09           wywietl list postaci, otwrz okienko "COMMAND"
3982 ldy #$59           i wpisz do niego "TAKE SOMETHING FROM <nazwa postaci>"
3984 jsr $2436          (i wstaw do $0913 numer postaci)
3987 lda $0913          we numer wybranej postaci
398a jsr $31d2          oblicz w $e1,2 adres pocztku jej stanu posiadania
398d ldy #$00           czy pierwszy bajt opisu stanu posiadania wybranej
398f lda ($e1),y        postaci jest rwny 0?
3991 bne $3996          nie -> przeskocz nastpn instrukcj
3993 jmp $2275          Drukuj tekst "GIMBAL'S HANDS ARE EMPTY"
3996 lda #$00           Otwrz okienko z list przedmiotw oraz tekstem
3998 sta $092b          "TAKE WHICH OBJECT ?" (adres: $5900). Zera w X i Y
399b lda #$00           oznaczaj, e procedura ma nie otwiera okienka
399d tax                "COMMAND".
399e tay
399f lda #$59
39a1 sta $092c
39a4 jsr $2567          skok do procedury wywietlajcej okienko
39a7 pha                identyfikator wybranej pozycji (litera) na stos
39a8 jsr $2135          otwrz u dou ekranu okienko "COMMAND"
39ab ldx #$07           dopisz w okienku "TAKE"
39ad ldy #$59
39af jsr $2197
39b2 pla                pobierz identyfikator - liter przypisan przedmiotowi
39b3 jsr $2f77          wpisz nazw wybranego przedmiotu do okienka "COMMAND"
39b6 ldx #$0d           dopisz w okienku pomocniczym "FROM "
39b8 ldy #$59
39ba jsr $2197
39bd lda $0913          ta instrukcja jest niepotrzebna (A jest niesprawdzane)
39c0 jsr $2234          wpisz w pomocn. okienku u dou nazw skrtow postaci
39c3 jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
39c6 lda $0451          Czy istnieje pity przedmiot niesiony przez M.K.?
39c9 beq $39ce          nie -> przeskok nastpnej instrukcji
39cb jmp $2252          Drukuj tekst "YOUR HANDS ARE FULL"
39ce jsr $2d98          Sprawd, czy Magic Knight moe podnie przedmiot
39d1 bcc $39d6          C = 0 -> moe
39d3 jmp $2259          Drukuj tekst "THAT OBJECT IS TOO HEAVY"
39d6 jsr $3932          wpisz do A HAPPINESS postaci, ktrej dotyczy polecenie
39d9 cmp #$1e           jeeli jest wiksza lub rwna $1e,
39db bcs $39e0          to skok do $39e0
39dd jmp $227c          Drukuj tekst "GIMBAL WANTS TO KEEP THAT"
39e0 ldx $2d66          zaaduj do X nr przedmiotu, ktrego dotyczy polecenie
39e3 lda $0913          we do A numer postaci, ktrej dotyczy polecenie
39e6 bne $39eb          jeeli nie jest to GIMBALL -> $39eb
39e8 jmp $3a6c          skok do fragmentu przenoszcego przedmiot
39eb cmp #$01           Czy Magic Knight zabiera przedmiot od Thora?
39ed bne $3a12          nie -> przeskok do $3a12
39ef cpx #$03           Czy Magic Knight zabiera "MIOLNIR"?
39f1 bne $3a0f          nie -> $3a0f
39f3 lda $593a          ustaw pozycj dolnej krawdzi okienka $0d na 10
39f6 sta $4b16
39f9 lda #$0d           Rysuj okienko nr. $0d
39fb jsr $1727
39fe ldx #$3b           drukuj tekst "THOR IS ANGRY. A THUNDER STORM..."
3a00 ldy #$59
3a02 jsr $148b
3a05 jsr $211c          Wydrukuj "Press fire to continue" i poczekaj na fire
3a08 ldx #$bc           drukuj "THOR KILLED YOU" i zakocz gr
3a0a ldy #$59
3a0c jmp $2c49
3a0f jmp $3a6c          skok do fragmentu przenoszcego przedmiot
3a12 cmp #$02           Czy Magic Knight zabiera przedmiot od Florina?
3a14 bne $3a35          nie -> przeskok do $3a35
3a16 cpx #$05           Czy przedmiotem tym jest "STICKY BUN"
3a18 bne $3a1d          nie -> przeskok do $3a1d
3a1a jmp $227c          Drukuj tekst "GIMBAL WANTS TO KEEP THAT"
3a1d cpx #$0b           Czy przedmiotem tym jest "BROKEN TALISMAN"?
3a1f beq $3a1a          tak -> "FLORIN WANTs TO KEEP THAT"
3a21 cpx #$0a           Czy przedmiotem tym jest "TUBE OF GLUE"?
3a23 beq $3a1a          tak -> "FLORIN WANTs TO KEEP THAT"
3a25 cpx #$1e           Czy przedmiotem tym jest "GOLD BAR"?
3a27 beq $3a1a          tak -> "FLORIN WANTs TO KEEP THAT"
3a29 cpx #$1a           Czy przedmiotem tym jest "BOTTLE OF LIQUID"?
3a2b bne $3a32          nie -> przeskok poniszych dwch instrukcji
3a2d lda #$60           Ustaw na $60 si Magic Knighta
3a2f sta $03fd
3a32 jmp $3a6c          skok do fragmentu przenoszcego przedmiot
3a35 cmp #$03           Czy Magic Knight zabiera przedmiot od Orika?
3a37 bne $3a43          nie -> przeskok do $3a43
3a39 cpx #$02           Czy przedmiotem tym jest "BOOK OF SHADOWS"?
3a3b bne $3a40          nie -> przeskok nastpnej instrukcji
3a3d jmp $227c          Drukuj tekst "GIMBAL WANTS TO KEEP THAT"
3a40 jmp $3a6c          skok do fragmentu przenoszcego przedmiot
3a43 cmp #$04           Czy Magic Knight zabiera przedmiot od Samsuna?
3a45 bne $3a55          nie -> przeskok do $3a55
3a47 cpx #$08           Czy przedmiotem tym jest "JAVELIN"
3a49 bne $3a4e          nie -> przeskok nastpnej instrukcji
3a4b jmp $227c          Drukuj tekst "GIMBAL WANTS TO KEEP THAT"
3a4e cpx #$1d           Czy przedmiotem tym jest "PLATFORM"
3a50 beq $3a4b          tak -> "SAMSUN WANTS TO KEEP THAT"
3a52 jmp $3a6c          skok do fragmentu przenoszcego przedmiot
3a55 cmp #$05           Czy Magic Knight zabiera przedmiot od Elranda?
3a57 bne $3a60          nie -> przeskok do $3a60
3a59 cpx #$28           Czy przedmiotem tym jest "TRUMPET"?
3a5b beq $3a4b          tak -> "ELRAND WANTS TO KEEP THAT"
3a5d jmp $3a6c          skok do fragmentu przenoszcego przedmiot
3a60 cmp #$06           Czy Magic Knight zabiera przedmiot od Rosmar?
3a62 bne $3a6c          nie -> przeskok do $3a6c
3a64 cpx #$12           Czy przedmiotem tym jest "FAST BLOW FUSE"?
3a66 beq $3a4b          tak -> "ROSMAR WANTS TO KEEP THAT"
3a68 cpx #$24           Czy przedmiotem tym jest "POCKET LASER"?
3a6a beq $3a4b          tak -> "ROSMAR WANTS TO KEEP THAT"
3a6c lda $0913          we numer postaci, ktrej dotyczy polecenie
3a6f jsr $31d2          oblicz w $e1,2 adres stanu posiadania postaci o nr w A
3a72 lda $2d66          we numer przedmiotu, ktrego dotyczy polecenie
3a75 jsr $3049          usu przedmiot o numerze w A ze stanu w $e1,2
3a78 jsr $31c9          Ustaw $e1,2 na adres stanu posiadania Magic Knighta
3a7b lda $2d66          we numer przedmiotu, ktrego dotyczy polecenie
3a7e jsr $2d81          wstaw do stanu posiadania MK przedmiot podany w A
3a81 jmp $2d4d          wywietl "YOU ARE NOW CARRYING ..." i zakocz obsug

; Realizacja polecenia "THROW SOMETHING"

3a84 lda $091f          Czy wolno uy polecenia "THROW SOMETHING"?
3a87 and #$10
3a89 bne $3a8e          Z = 1 ->  tak - przeskok nastpnej instrukcji
3a8b jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr
3a8e jsr $40e6          Efekt dwikowy nr. 1
3a91 lda $0948          ustaw moliwo wykonywania tego polecenia na GIMBALLU
3a94 ora #$01
3a96 sta $0948
3a99 jsr $31c9          Ustaw $e1,2 na adres stanu posiadania Magic Knighta
3a9c lda #$56           Otwrz okienko z list przedmiotw oraz okienko
3a9e sta $092b          COMMAND", do ktrego wpisz "THROW" (adres: $6b5d).
3aa1 lda #$6b           Lista przedmiotw ma zosta poprzedzona tekstem
3aa3 sta $092c          "THROW WHICH OBJECT ?" (adres: $6b56)
3aa6 ldx #$5d
3aa8 ldy #$6b
3aaa jsr $2567          skok do procedury wywietlajcej okienko
3aad jsr $2f77          wpisz nazw wybranego przedmiotu do okienka "COMMAND"
3ab0 ldx #$5f           dopisz w okienku pomocniczym " AT " (i ustaw $2d66)
3ab2 ldy #$6b
3ab4 jsr $2197
3ab7 lda #$1a           tekstem dodatkowym, wpisywanym po "WHO DO YOU WANT TO"
3ab9 sta $092b          bdzie "THROW AN OBJECT AT ?"
3abc lda #$53
3abe sta $092c
3ac1 ldx #$00           wywietl list postaci, ale nie otwieraj okienka
3ac3 ldy #$00           "COMMAND" (X = Y = 0)
3ac5 jsr $2436
3ac8 jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
3acb lda $2d66          we nr przedmiotu, ktrego dotyczy polecenie
3ace jsr $1982          Zwr w $d9,a adres opisu przedmiotu o numerze w A
3ad1 ldy #$00           we WEIGHT tego przedmiotu
3ad3 lda ($d9),y
3ad5 cmp #$0c           jeeli mniejsza od $0c,
3ad7 bcc $3adc          to skok pod $3adc
3ad9 jmp $3b94          skok do fragmentu drukujcego "YOU KILLED YOURSELF..."
3adc ldy #$04           we THROW/BLOW STATUS przedmiotu, ktrym mamy rzuci
3ade lda ($d9),y
3ae0 and #$10           sprawd, czy rzucanie przedmiotem jest niebezpieczne
3ae2 beq $3ae7          nie -> $3ae7 (przeskocz nastpn instrukcj)
3ae4 jmp $3b9b          do proc. drukuj.: "YOU THREW SOMETHING AND KILLED ..."
3ae7 lda ($d9),y        ponownie we THROW/BLOW STATUS danego przedmiotu
3ae9 and #$20           czy to jeden z krysztaw do uwolnienia GIMBALLA?
3aeb beq $3af5          nie -> $3af5 (normalne rzucania)
3aed lda $0913          we nr postaci, w ktr rzucamy (ustaw. w proc. $2436)
3af0 bne $3af5          jeeli to nie GIMBALL -> $3af5 (normalne rzucanie)
3af2 jmp $3b3c          skok do proc. wykonujcej rzucanie kryszt. w GIMBALLA
3af5 lda $2d66          we nr rzucanego przedmiotu (ustawiony w proc. $2f77)
3af8 cmp #$10           czy jest to "GLOWING BOTTLE"
3afa bne $3b02          nie -> $3b02
3afc jsr $2ffd          uwolnij BANSHEE, w A bdzie si kod "BROKEN GLASS"
3aff sta $2d66          zapisz "BROKEN GLASS" jako kod wyrzucanego przedmiotu
3b02 jsr $31c9          Ustaw $e1,2 na adres stanu posiadania Magic Knighta
3b05 lda $2d66          we nr rzucanego przedmiotu
3b08 jsr $3044          usu go ze stanu posiadania Magic Knighta
3b0b lda $2d66          we nr rzucanego przedmiotu
3b0e sta $3b14          wstaw go jako argument adc
3b11 asl @              A = nr przedmiotu * 2
3b12 clc
3b13 adc #$00           A = nr przedmiotu * 3 (argument jest ustawiony)
3b15 tax                jest to indeks w tablicy rozmieszczenia przedmiotw
3b16 lda $090d          we nr lokacji Magic Knighta
3b19 sta $0492,x        wstaw go jako lokacj, w ktrej znajduje si przedmiot
3b1c lda $0913          we nr postaci, ktrej dotyczy polecenie
3b1f sta $3b25          wstaw go jako argument adc
3b22 asl @              A = nr postaci * 2
3b23 clc
3b24 adc #$00           A = nr postaci * 3 (argument jest ustawiony)
3b26 tay                jest to indeks w tablicy rozmieszczenia postaci
3b27 lda $047b,y        we kratkow pozycj X postaci w ktr rzucamy
3b2a sta $0493,x        bdzie to pozycja X przedmiotu
3b2d lda $047c,y        we kratkow pozycj Y postaci w ktr rzucamy
3b30 clc                dodaj 3 kratki, gdy pozycj Y przedmiotw
3b31 adc #$03           s liczone od 1 a nie od 0
3b33 sta $0494,x        bdzie to pozycja Y przedmiotu
3b36 jsr $1ce9          Ustal, jaki skad powinno mie menu
3b39 jmp $23b5          Drukuj tekst "<nazwa przedmiotu> LANDED..."

; Specjalny fragment procedury rzucania przedmiotu, ktry wykonuje si wtedy,
; gdy rzucamy krysztaami w GIMBALLA

3b3c lda $093b          we zawart. komrki, w ktrej pamitamy rzucone czary
3b3f and #$01           czy rzucono czar "CRYSTALLIUM SPECTRALIS"?
3b41 bne $3b46          tak -> $4b46 (przeskocz nastpn instrukcj)
3b43 jmp $2399          Drukuj tekst "...TELEPAHIC WHISPER FROM GIMBALL..."
3b46 ldx $2d66          wstaw do X nr rzucanego przedmiotu
3b49 lda #$02           we mask do eorowania na bitach 1 i 0 palety GIMBALLA
3b4b cpx #$15           czy rzucanym przedmiotem jest "GREEN CRYSTAL"?
3b4d beq $3b57          tak -> $3b57 (wykonaj eorowanie na palecie GIMBALLA)
3b4f lda #$0c           we mask do eorowania na bitach 3 i 2 palety GIMBALLA
3b51 cpx #$17           czy rzucanym przedmiotem jest "RED CRYSTAL"?
3b53 beq $3b57          tak -> $3b57 (wykonaj eorowanie na palecie GIMBALLA)
3b55 lda #$40           we mask do eorowania na bitach 7 i 6 palety GIMBALLA
3b57 eor $1862          wykonaj eorowanie na masce palety GIMBALLA
3b5a sta $1862
3b5d lda $2d66          we nr rzucanego przedmiotu
3b60 jsr $3044          usu ze stanu posiadania MK przedmiot o kodzie w A
3b63 lda $1862          czy do rysowania GIMBALLA uywana jest standar. paleta
3b66 cmp #$e4           (co moe nastpi dopiero po rzuceniu trzema kryszt.)
3b68 bne $3b7d          nie -> $3b7d (GIMBALL nie jest jeszcze wolny)
3b6a lda $0916          zapamitaj, e rzucono wszystkimi trzema krysztaami
3b6d ora #$01           w GIMBALLA
3b6f sta $0916
3b72 lda #$0b           tekstem dodatkowym przy wykonywaniu EXAMINE na GIMBALU
3b74 sta $040c          bdzie "GIMBAL IS READY TO CAST A RELEASE SPELL"
3b77 jsr $4199          szybkie miganie ramk obrazu (rzucanie czaru)
3b7a jmp $235a          Drukuj tekst "SUCCESS! GIMBAL IS FREE AT LAST"

3b7d jsr $4199          szybkie miganie ramk obrazu (rzucanie czaru)
3b80 lda $2d66          we nr przedmiotu, ktry ma by rzucony
3b83 cmp #$15           czy rzucany jest "GREEN CRYSTAL"?
3b85 bne $3b8a          nie -> przeskocz nastpn instrukcj
3b87 jmp $23ae          Drukuj tekst "THE GREEN CRYSTAL FLEW AT GIMBAL..."
3b8a cmp #$16           czy rzucany jest "BLUE CRYSTAL"?
3b8c bne $3b91          nie -> przeskocz nastpn instrukcj
3b8e jmp $23a0          Drukuj tekst "THE BLUE CRYSTAL FLEW AT GIMBAL..."
3b91 jmp $23a7          Drukuj tekst "THE RED CRYSTAL FLEW..."
3b94 ldx #$d8           drukuj "YOU KILLED YOURSELF TRYING TO THROW..."
3b96 ldy #$50           i zakocz gr
3b98 jmp $2c49
3b9b ldx #$fb           drukuj "YOU THREW SOMETHING AND KILLED..." i zakocz
3b9d ldy #$50           gr
3b9f jmp $2c49

; Realizacja polecenia "EXAMINE"

3ba2 jsr $40e6          Efekt dwikowy nr. 1
3ba5 lda $0948          ustaw moliwo wykonywania tego polecenia na GIMBALLU
3ba8 ora #$01
3baa sta $0948
3bad jsr $2135          otwrz u dou ekranu okienko "COMMAND"
3bb0 ldx #$1e           dopisz w okienku pomocniczym "EXAMINE "
3bb2 ldy #$5a
3bb4 jsr $2197
3bb7 lda #$10           narysuj okienko ze strzak o numerze $10
3bb9 jsr $171e
3bbc ldx #$20           wpisz do okienka tekst "EXAMINE WHAT ?"
3bbe ldy #$5a           (adres $5a20)
3bc0 jsr $148b
3bc3 jsr $1af6          zwr w A identyfikator wybranej joystickiem pozycji
3bc6 cmp #$4f           czy wybrano EXAMINE OBJECT?
3bc8 bne $3bcd
3bca jmp $3c71          tak -> $3c71
3bcd cmp #$43           czy wybrano EXAMINE CHARACTER?
3bcf bne $3bd4
3bd1 jmp $3c07          tak -> 3c07
3bd4 ldx #$15           dopisz w okienku pomocniczym "YOURSELF"
3bd6 ldy #$5c
3bd8 jsr $2197
3bdb jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
3bde lda #$12           rysuj okienko nr $12
3be0 jsr $1727
3be3 lda #$0e           wywietlony bdzie Common String o nr
3be5 sta $0913          $82 - $5b + $0e = $35 (MAGIC KNIGHT)
3be8 lda #$07           adresem na wpisanie progressu bdzie $5b07
3bea sta $30            (fragment tekstu opisujcego Magic Knighta)
3bec lda #$5b
3bee sta $31
3bf0 ldx #$13           adresem na wpisanie pozostaego jeszcze czasu gry
3bf2 ldy #$5b           bdzie $5b13
3bf4 jsr $3d79          oblicz progress i wpisz pozostay jeszcze czas gry
3bf7 ldx #$fd           zapamitaj w $d9,a adres tabeli atrybutw MK ($03fd)
3bf9 stx $d9
3bfb ldx #$03
3bfd stx $da
3bff lda #$00           ustaw nr bitmapy odpowiadajcej Magic Knightowi
3c01 sta $3c61          jako argument instrukcji lda (poniej)
3c04 jmp $3c2f          skok do rodka procedury EXAMINE CHARACTER

; Wybrano opcj "EXAMINE CHARACTER"

3c07 ldx #$00           X i Y rwne zero oznaczaj, e wywoanie procedury
3c09 ldy #$00           $2436 nie spowoduje otwarcia okienka "COMMAND"
3c0b lda #$08           tekstem dodatkowym, wpisywanym po "WHO DO YOU WANT TO"
3c0d sta $092b          bdzie "EXAMINE ?"
3c10 lda #$53
3c12 sta $092c
3c15 jsr $2436          wywietl okienko z list postaci
3c18 jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
3c1b lda #$12           narysuj okienko nr $12
3c1d jsr $1727
3c20 lda $0913          pobierz nr postaci (ustawiony przez procedur $2436)
3c23 clc                dodaj do tego $45 aby uzyska numer bitmapy
3c24 adc #$45           przypisanej danej postaci
3c26 sta $3c61          zapisz to jako argument lda (poniej)
3c29 lda $0913          we numer postaci (ustawiony przez procedur $2436)
3c2c jsr $31b4          Oblicz adres pocztku atrybutw postaci o numerze w A
3c2f jsr $3d0a          Druk. STRENGTH, HAPPINESS, STAMINA, POWER, FOOD LEVEL
3c32 ldx #$3d           drukuj tekst "... STRENGTH ... HAPPINESS ..."
3c34 ldy #$5a           o adresie $5a3d
3c36 jsr $148b
3c39 ldy #$06           pobierz SLEEP STATUS (ktry na najm. 7 bitach zawiera
3c3b lda ($d9),y                              nr tekstu do wydrukowania)
3c3d bmi $3c43          jeeli posta pi -> $3c43 (A = nr tekstu + $80)
3c3f ldy #$07           we nr tekstu dodatkowego przypisanego postaci + $80
3c41 lda ($d9),y
3c43 and #$7f           odejmij $80
3c45 tax                nr tekstu do X
3c46 lda #$fd           tablica tekstw dodatkowych zaczyna si od adresu
3c48 ldy #$5a           $5afd
3c4a jsr $2543          przeskocz do X-tego tekstu, jego adres zapisz w $d5,6
3c4d jsr $148f          drukuj ten tekst w okienku
3c50 lda #$13           rysuj okienko nr $13 (mae okienko otaczajce posta)
3c52 jsr $1727
3c55 ldx $090e          zaaduj do X i Y pozycj lewej i grnej poz. okienka
3c58 ldy $090f          
3c5b lda #$e4
3c5d jsr $0dea          Przetwrz palet ($e4) na kody poszczeglnych kolorw
3c60 lda #$00           argument lda jest ustawiony na nr bitmapy
3c62 stx $0907          pozycje z X i Y bd stanowiy starszy i modszy bajt
3c65 sty $0909          adresu od ktrego rysowana bdzie bitmapa postaci
3c68 jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
3c6b jsr $211c          Wydrukuj "Press fire to continue" i poczekaj na fire
3c6e jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr

; Wybrano opcj "EXAMINE OBJECT"

3c71 jsr $31c9          Ustaw $e1,2 na adres stanu posiadania Magic Knighta
3c74 lda #$17           Otwrz okienko z list przedmiotw oraz tekstem
3c76 sta $092b          "EXAMINE WHICH OBJECT ?" (adres: $5a17). Zera w X i Y
3c79 lda #$5a           oznaczaj, e procedura ma nie otwiera okienka
3c7b sta $092c          "COMMAND".
3c7e ldx #$00
3c80 ldy #$00
3c82 jsr $2567          skok do procedury wywietlajcej okienko
3c85 jsr $2f77          wpisz nazw wybranego przedmiotu do okienka "COMMAND"
3c88 jsr $220e          wywietl okienko EXECUTE/REJECT COMMAND
3c8b lda $2d66          we nr przedmiotu (ustawia go procedura $2f77)
3c8e jsr $1982          Zwr w $d9,a adres opisu przedmiotu o numerze w A
3c91 jsr $3cdb          wstaw odpowiednie wartoci do opisu przedmiotu
3c94 lda #$14           rysuj okienko nr $14
3c96 jsr $1727
3c99 ldx #$aa           drukuj "EXAMINE"
3c9b ldy #$5a
3c9d jsr $148b
3ca0 ldx $2d66          wstaw do X nr przedmiotu (ustawiony przez proc. $2f77)
3ca3 jsr $253f          zapisz w $d5,6 adres pocztku jego nazwy
3ca6 jsr $148f          drukuj ten tekst
3ca9 ldx #$af           zaaduj do X i Y adres ($5aaf) tekstu
3cab ldy #$5a           "WEIGHT ... DROP STATUS ..." do wydrukowania w okienku
3cad jsr $148b          drukuj tekst w oknie
3cb0 lda #$15           rysuj okienko nr $15 (mae okienko otaczajce przedmiot)
3cb2 jsr $1727
3cb5 ldx $090e          pozycja lewej i grnej krawdzi maego okienka bdzie
3cb8 ldy $090f          starszym i modszym bajtem adresu, od ktrego
3cbb stx $0907          wywietlana bdzie bitmapa przedmiotu
3cbe sty $0909
3cc1 lda $2d66          we nr przedmiotu (ustawionego przez procedur $2f77)
3cc4 jsr $1982          Zwr w $d9,a adres opisu przedmiotu o numerze w A
3cc7 ldy #$06           we palet przypisan do przedmiotu
3cc9 lda ($d9),y
3ccb jsr $0dea          Przetwrz palet na kody poszczeglnych kolorw
3cce ldy #$07           we numer bitmapy przedmiotu
3cd0 lda ($d9),y
3cd2 jsr $0fc5          Wywietl du bitmap (A - nr, $0907, $0909 - offset)
3cd5 jsr $211c          Wydrukuj "Press fire to continue" i poczekaj na fire
3cd8 jmp $20d1          zablokuj moliwo wykonyw. polec. na GIMBALLU i wr

; Procedura wstawia odpowiednie wartoci do tekstu opisu przedmiotu
; (adres $5aaf). Adres atrybutw przedmiotu zapisany jest w $d9,a

3cdb ldy #$00           we WEIGHT przedmiotu
3cdd lda ($d9),y
3cdf ldx #$be           bdziemy j chcieli umieci w postaci zapisu
3ce1 ldy #$5a           dziesitnego od adresu $5abe (do tekstu do wydruk.)
3ce3 jsr $3d42          Przekszta liczb w A do postaci zapisu dziesitnego
3ce6 ldx #$93           wstaw do X kod tekstu "YES"
3ce8 ldy #$01           we DROP STATUS przedmiotu
3cea lda ($d9),y
3cec beq $3cef          jeeli mona upuci (kod w X jest dobry) -> $3cef
3cee inx                zwikszamy X o 1, tak, aby by to kod tekstu "NO"
3cef stx $5ad5          wstawiamy go do tekstu do wydrukowania (DROP STATUS)
3cf2 ldy #$02           pod indeksem 2 w tablicy arybutw jest READ STATUS
3cf4 ldx #$93           wstaw do X kod tekstu "YES"
3cf6 lda ($d9),y        we READ STATUS przedmiotu
3cf8 bne $3cfb          jeeli jest opis (kod w X jest dobry) -> $3cfb
3cfa inx                zwikszamy X o 1, tak, aby by to kod tekstu "NO"
3cfb stx $5ae5          wstawiamy go do tekstu do wydrukowania (READ STATUS)
3cfe ldy #$03           we MAGIC POWER przedmiotu
3d00 lda ($d9),y
3d02 ldx #$f4           bdziemy j chcieli umieci w postaci zapisu
3d04 ldy #$5a           dziesitnego od adresu $5af4 (do tekstu do wydruk.)
3d06 jsr $3d42          Przekszta liczb w A do postaci zapisu dziesitnego
3d09 rts

; Wydrukuj STRENGTH, HAPPINESS, STAMINA, SPELL POWER i FOOD LEVEL

3d0a ldy #$00           Wydrukuj STRENGTH w postaci liczby w kodzie Ascii
3d0c lda ($d9),y
3d0e ldx #$4e
3d10 ldy #$5a
3d12 jsr $3d42          Przekszta liczb w A do postaci zapisu dziesitnego
3d15 ldy #$01           Wydrukuj HAPPINESS w postaci liczby w kodzie Ascii
3d17 lda ($d9),y
3d19 ldx #$64
3d1b ldy #$5a
3d1d jsr $3d42          Przekszta liczb w A do postaci zapisu dziesitnego
3d20 ldy #$02           Wydrukuj STAMINA w postaci liczby w kodzie Ascii
3d22 lda ($d9),y
3d24 ldx #$79
3d26 ldy #$5a
3d28 jsr $3d42          Przekszta liczb w A do postaci zapisu dziesitnego
3d2b ldy #$03           Wydrukuj SPELL POWER w postaci liczby w kodzie Ascii
3d2d lda ($d9),y
3d2f ldx #$8b
3d31 ldy #$5a
3d33 jsr $3d42          Przekszta liczb w A do postaci zapisu dziesitnego
3d36 ldy #$04           Wydrukuj FOOD LEVEL w postaci liczby w kodzie Ascii
3d38 lda ($d9),y
3d3a ldx #$a1
3d3c ldy #$5a
3d3e jsr $3d42          Przekszta liczb w A do postaci zapisu dziesitnego
3d41 rts

; Przekszta liczb z A do postaci zapisu dziesitnego (XXX).
; Wynik umie (w postaci kodw Ascii) poczynajc od komrki o adresie
; zapisanym w X (modszy bajt) i Y (starszy bajt)

3d42 stx $30            wstaw adres pierwszej komrki docelowej
3d44 sty $31
3d46 pha                wstaw na stos liczb do konwersji
3d47 ldy #$00
3d49 lda #$20           wstaw do pierwszej komrki kod ASCII spacji
3d4b sta ($30),y
3d4d iny
3d4e sta ($30),y        wstaw to samo do drugiej
3d50 iny
3d51 lda #$30           wstaw do trzeciej komrki kod cyfry '0'
3d53 sta ($30),y
3d55 pla                pobierz ze stosu liczb do konwersji
3d56 jsr $3d6c          Skoryguj liczb w A do postaci liczby mniejszej od $0a
3d59 cmp #$00           Jeeli X = 0 i A = 0, to nic nie trzeba robi
3d5b bne $3d62          (jest ju wpisane "  0")
3d5d cpx #$00
3d5f bne $3d62
3d61 rts

3d62 clc                wpisz przeksztacon liczb na waciwe miejsce
3d63 adc #$30           (przeksztacajc na kod Ascii cyfry)
3d65 sta ($30),y
3d67 txa                X = A - by moe le zapisana cyfra poprzedzajca
3d68 dey                zmniejsz Y, bo to jest cyfra poprzednia
3d69 bpl $3d56          jeli nie jest ona ostatnia -> powtrz proces
3d6b rts

; Odejmuj kolejno $0a od A a uzyskasz liczb mniejsz od $0a.
; Niech X bdzie rwne liczbie odejmowa.

3d6c ldx #$00
3d6e cmp #$0a
3d70 bcs $3d73
3d72 rts
3d73 sec
3d74 sbc #$0a
3d76 inx
3d77 bne $3d6e          (jmp)

; Procedura oblicza postp w grze (progress) i wpisuje go w postaci liczby
; dziesitnej poczwszy od adresu przekazanego w $30,1. Wpisywany jest ponadto
; pozostay jeszcze czas gry - w formie zapisu dzisitnego - poczwszy od
; adresu przekazanego w X i Y.

3d79 txa                X na stos
3d7a pha
3d7b tya                Y na stos
3d7c pha
3d7d ldy #$00           inicjujemy na zero liczb odwiedzonych lokacji
3d7f ldx #$00           zaczniemy przegldanie od bajtu dla poziomu "ROOF"
3d81 lda $093c,x        we bajt, gdzie zaznaczono, w ktrych pokojach by MK
3d84 asl @              ostatni bajt do CARRY
3d85 bcc $3d88          C = 0 - w lokacji nie byo Magic Knighta -> $3d88
3d87 iny                zwiksz o 1 liczb odwiedzonych lokacji
3d88 cmp #$00           czy jeszcze w ogle s jakie ustawione bity w bajcie?
3d8a bne $3d84          tak (liczymy dalej) -> $3d84
3d8c inx                nastpne pitro
3d8d cpx #$07           czy przetworzylimy wanie szste (liczc od zera)?
3d8f bne $3d81          nie -> $3d81 (przetwarzamy nastpne pitro)
3d91 dey                odejmujemy jedn lokacj (odwiedzenie THE START ROOM)
3d92 lda $093b          A = $04, jeli rzucono czar "CANDELIUM ILLUMINATUS"
3d95 and #$02
3d97 asl @
3d98 jsr $3de0          Dodaj A do Y, wynik przeka w Y
3d9b lda $093b          A = $04, jeli rzucono czar "ARMOURIS PHOTONICUS"
3d9e and #$04
3da0 jsr $3de0          Dodaj A do Y, wynik przeka w Y
3da3 lda $093b          A = $04, jeli rzucono czar "FUMATICUS PROTECTIUM"
3da6 and #$08
3da8 lsr @
3da9 jsr $3de0          Dodaj A do Y, wynik przeka w Y
3dac lda $093b          A = $04, jeli rzucono czar "CRYSTALLIUM SPECTRALIS"
3daf and #$01
3db1 asl @
3db2 asl @
3db3 asl @
3db4 jsr $3de0          Dodaj A do Y, wynik przeka w Y
3db7 lda $093b          A = $10, jeli rzucono czar "RELEASE SPELL"
3dba and #$10
3dbc jsr $3de0          Dodaj A do Y, wynik przeka w Y
3dbf lda $0916          sprawd, czy rzucono wszystkimi trzema krysztaami
3dc2 and #$01           w GIMBALLA
3dc4 beq $3dcb          nie -> $3bcb
3dc6 lda #$07           naley si za to 7 punktw do progressu
3dc8 jsr $3de0          Dodaj A do Y, wynik przeka w Y
3dcb lda $0943          we liczb uwolnionych postaci
3dce jsr $3de0          Dodaj A do Y, wynik przeka w Y
3dd1 tya                to co wyliczono przeka do A
3dd2 jsr $3d46          zapisz liczb w postaci dziesitnej w pamici od $30,1
3dd5 pla                we Y ze stosu (modszy bajt adresu na wpisanie
3dd6 tay                                pozostaego jeszcze czasu gry
3dd7 pla                we X ze stosu (starszy bajt)
3dd8 tax
3dd9 lda $0925          we pozostay jeszcze czas gry
3ddc jsr $3d42          Przekszta liczb w A do postaci zapisu dziesitnego
3ddf rts

; Dodaj A do Y, wynik przeka w Y

3de0 sta $3de6
3de3 tya
3de4 clc
3de5 adc #$00
3de7 tay
3de8 rts

; Nowa procedura przerwania VVBLK

3de9 lda #$00
3deb sta atract         brak przycigania uwagi
3ded inc $0946          zwiksz o 1 licznik wykona procedury VVBLK
3df0 lda $d9            zachowaj $d9,a
3df2 pha
3df3 lda $da
3df5 pha
3df6 lda $2136          jeeli ostatnio narysowane okienko ma nr $06 (ktre
3df9 cmp #$06           moe si pojawi tylko przy starcie gry "SPELLBOUND
3dfb beq $3e07          ... TRUE ... ADVENTURE) -> $3e07 (czas nie pynie)
3dfd lda $0947          czy ustawiony jest najmodszy bit w $0947?
3e00 and #$01
3e02 beq $3e07          nie -> przeskocz symulowanie upywu czasu
3e04 jsr $3e46          symuluj upyw czasu, modyfik. atr. wykonaj los. ruchy
3e07 pla                odtwrz $d9,a
3e08 sta $da
3e0a pla
3e0b sta $d9
3e0d jmp $c0e2          argument = stare VVBLKI

; Ustaw VVBLKI

3e10 lda vvblki
3e13 sta $3e0e
3e16 lda vvblki+1
3e19 sta $3e0f          ustaw argument jmp na adres starego VVBLKI
3e1c lda #$e9
3e1e ldy #$3d           $3de9 = nowe VVBLKI
3e20 ldx #$05           odczekaj
3e22 sta wsync
3e25 dex
3e26 bne $3e25
3e28 sta vvblki         ustaw!
3e2b sty vvblki+1
3e2e rts

; Procedura wypisuje tekst o mierci godowej postaci o numerze przekazanym w
; X i koczy gr

3e2f stx $0913          zapisz nr postaci w komrce uywanej przy drukowaniu
3e32 ldx #$cf           wstaw do X i Y adres tekstu "... HAS STARVED TO DEATH"
3e34 ldy #$70
3e36 lda #$00           skasowanie wskanikw wystpienia przerwania w nmist,
3e38 sta nmires         co prawdopodobnie nie jest do niczego potrzebne
3e3b cli                wcz przerwania maskowalne
3e3c jmp $2c49          drukuj w okienku tekst o adresie w X, Y i zakocz gr

; Zakocz gr z powodu upynicia czasu przeznaczonego na ni

3e3f ldx #$3e           wpisz do X, Y adres tekstu "YOU RAN OUT OF TIME"
3e41 ldy #$71
3e43 jmp $3e36          wyskocz z procedury przerwania i zakocz gr

; Procedura symulujca upyw czasu, wykonujca losowy ruch wind i postaciami,
; modyfikujca atrybuty postaci

3e46 inc $0923          Zwiksz liczb ramek
3e49 lda $0923
3e4c cmp #$32           Czy jest rwna 50?
3e4e beq $3e51          tak -> przeskocz nastpn instrukcj
3e50 rts

3e51 lda #$00           ustaw liczb ramek na 0
3e53 sta $0923
3e56 jsr $3fef          przemie losowo postacie
3e59 inc $0924          zwiksz liczb sekund
3e5c lda $0924          czy jest rwna 50?
3e5f cmp #$3c
3e61 beq $3e64          tak -> przeskocz nastpn instrukcj
3e63 rts

3e64 lda #$00           ustaw liczb sekund na 0
3e66 sta $0924
3e69 jsr $3e97          dokonaj modyfik. atrybut. postaci wystpujcych w grze
3e6c jsr $3f66          wykonaj losowy ruch wind
3e6f lda $4c4d          we nr napisu drukowanego przy czytan. "CRYSTALL BALL"
3e72 clc                +1 (nastpny numer napisu)
3e73 adc #$01
3e75 cmp #$90           czy doszlimy do napisu nr $10 ($90-$80)?
3e77 bne $3e7b          nie -> $3e7b (ustaw nr napisu dla "CRYSTALL BALL")
3e79 lda #$8b           we pierwszy numer napisu dla "CRYSTALL BALL"
3e7b sta $4c4d          napis o nr w A bdzie druk. przy czyt. "CRYSTALL BALL"
3e7e inc $0926          zwiksz liczb minut (1 "godzina" = 5 minut)
3e81 lda $0926          czy jest ona rwna 5?
3e84 cmp #$05
3e86 beq $3e89          tak -> przeskocz nastpn instrukcj
3e88 rts
3e89 lda #$00           ustaw liczb minut na 0
3e8b sta $0926
3e8e dec $0925          zmniejsz liczb godzin o 1
3e91 bne $3e96          gdy po zmniejszeniu jest <> 0 -> skok do rts
3e93 jmp $3e3f          zakocz gr z powodu upynicia czasu na ni
3e96 rts

; Procedura dokonuje okresowej modyfikacji atrybutw postaci wystpujcych
; w grze (poza Magic Knightem, Banshee i Gimballem, gdy nie jest uwolniony).
; Na koniec sprawdzne jest, czy wszystkie postaci po modyfikacji yj.

3e97 ldx #$00           zainicjuj na 0 indeks do tablicy modyfikatorw
3e99 ldy #$00           zainicjuj na 0 indeks do tablicy atrybutw postaci
3e9b lda $0916          sprawd, czy rzucono wszystkimi trzema krysztaami
3e9e and #$01           w GIMBALLA
3ea0 bne $3ea6          tak -> $3ea6 (modyfikuj rwnie atrybuty GIMBALLA)
3ea2 ldx #$08           zainicjuj na 8 (za GIMBALLEM) indeks do tabl. modyfik.
3ea4 ldy #$08           zainicjuj na 8 (za GIMBALLEM) indeks do tabl. atrybut.
3ea6 lda $040b,y        we SLEEP STATUS przetwarzanej postaci
3ea9 bpl $3eaf          jeli nie pi -> $3eaf (uywaj rej. X jako indeksu)
3eab inx                X += 4, tak aby X wskazywao na pocztek pierwszej
3eac inx                prary modyfikatorw - uywanych gdy posta pi
3ead inx
3eae inx
3eaf lda $0405,y        we atrybut STRENGTH przetwarzanej postaci
3eb2 jsr $3f1c          oblicz now warto atrybutu uywajc modyfikatora
3eb5 sta $0405,y        zapisz now warto STRENGTH
3eb8 inx                zwiksz indeks do modyfikatora o 1
3eb9 lda $0406,y        we atrybut HAPPINESS przetwarzanej postaci
3ebc jsr $3f1c          oblicz now warto atrybutu uywajc modyfikatora
3ebf sta $0406,y        zapisz now warto HAPPINESS
3ec2 inx                zwiksz indeks do modyfikatora o 1
3ec3 lda $0407,y        we atrybut STAMINA przetwarzanej postaci
3ec6 jsr $3f1c          oblicz now warto atrybutu uywajc modyfikatora
3ec9 sta $0407,y        zapisz now warto STAMINA
3ecc inx                zwiksz indeks do modyfikatora o 1
3ecd lda $0408,y        we atrybut POWER przetwarzanej postaci
3ed0 jsr $3f1c          oblicz now warto atrybutu uywajc modyfikatora
3ed3 sta $0408,y        zapisz now warto POWER
3ed6 inx                zwiksz indeks do modyfikatora o 1
3ed7 lda $040b,y        we atrybut SLEEP STATUS przetwarzanej postaci
3eda bmi $3ee0          jeli pi -> $3ee0 (uywalimy drugiej pary modyfik.)
3edc inx                zwiksz X o 4 (uywalimy pierwszej pary modyfikat.)
3edd inx
3ede inx
3edf inx
3ee0 tya                przelij indeks to tabeli atrybutw postaci do A
3ee1 clc                +8 (bdzie wskazywa na atrybuty kolejnej postaci)
3ee2 adc #$08
3ee4 tay                odelij go do Y
3ee5 cpy #$38           czy przet. ju 7 postaci ($38 = 8 * 7) - bez BANSHEE?
3ee7 bne $3ea6          nie -> $3ea6 (przetwarzaj atrybuty kolejnej postaci)

3ee9 ldx #$00           zainicjuj licznik przetwarzanych ponownie postaci na 0
3eeb ldy #$00           zainicjuj na 0 indeks do tablicy atrybutw
3eed lda $0407,y        we atrybut STAMINA przetwarzanej postaci
3ef0 bne $3efd          jeeli niezerowy -> $3efd (posta nie zanie)
3ef2 lda $040b,y        we atrybut SLEEP STATUS przetwarzanej postaci
3ef5 ora #$80           ustaw w nim najstarszy bit - posta bdzie spa
3ef7 sta $040b,y        zapisz atrybut
3efa jmp $3f09          skok do fragmentu sprawdzajcego, czy posta yje
3efd cmp #$64           czy atrybut STAMINA jest rwny $64 (100) - maks.
3eff bne $3f09          nie -> $3f09 (jeli posta pi, nie budzimy jej)
3f01 lda $040b,y        we atrybut SLEEP STATUS przetwarzanej postaci
3f04 and #$7f           skasuj w nim najstarszy bit - posta si obudzi
3f06 sta $040b,y        zapisz atrybut
3f09 lda $0405,y        we atrybut STRENGTH przetwarzanej postaci
3f0c bne $3f11          jeeli wikszy od zera -> $3f11 (posta jeszcze yje)
3f0e jmp $3e2f          skok do  koca gry z powodu na zagodzenie post. w X
3f11 tya                przelij indeks do tablicy atrybutw postaci do A
3f12 clc                zwiksz go o 8
3f13 adc #$08
3f15 tay                odelij go do Y
3f16 inx                zwiksz o 1 liczb przetworzonych postaci
3f17 cpx #$07           czy przetworzylimy 7 (bez BANSHEE)?
3f19 bne $3eed          nie -> $3eed (kontynuacja przetwarzania)
3f1b rts

; Procudura modyfikuje atrybut postaci przekazany w A dodajc do niego
; modyfikator znajdujcy si w tablicy $3f2e pod indeksem przekazanym w X.
; Modyfikator jest liczb ze znakiem o module mniejszym od 28 (128 - 100).

3f1c clc                dodaj do wspczynnika postaci warto modyfikatora
3f1d adc $3f2e,x        zapisanego w tablicy $3f2e pod indeks. przekazanym w X
3f20 bpl $3f25          jeeli  < 128 -> $2f25 (nie jest poniej zera)
3f22 lda #$00           nowa warto wspo. jest = 0 (uzyskano liczb ujemn)
3f24 rts
3f25 cmp #$64           porwnaj now warto wspczynnika z $64 (100)
3f27 beq $3f24          jeeli wyszo 100 -> $2f24 (prawidowo)
3f29 bcc $3f24          jeeli nowy wsp. jest < 100 -> $2f24 (prawidowo)
3f2b lda #$64           jeeli wyszo > 100, nowy wsp. bdzie rwny 100
3f2d rts

; Tabela modyfikatorw wspczynnikw nastpujcych postaci: STRENGTH,
; HAPPINESS, STAMINA, POWER. Kady modyfikator jest liczb ze znakiem.
; Istniej dwa zestawy modyfikatorw: dla postaci, ktra nie pi (pierwszy) i
; dla postaci picej (drugi).

; Modyfikatory wspczynnikw Gimballa

3f2e dta $ff, $ff, $fd, $fc, $0a, $08, $0f, $0a

; Modyfikatory wspczynnikw Thora

3f36 dta $fa, $fd, $ff, $ff, $05, $03, $04, $01

; Modyfikatory wspczynnikw Florina

3f3e dta $fd, $ff, $fc, $fb, $03, $07, $04, $08

; Modyfikatory wspczynnikw Orika

3f46 dta $fd, $fe, $fc, $fc, $07, $08, $03, $09

; Modyfikatory wspczynnikw Samsuna

3f4e dta $ff, $fd, $fd, $ff, $0a, $02, $0a, $01

; Modyfikatory wspczynnikw Elranda

3f56 dta $fd, $fe, $fc, $fa, $08, $04, $04, $08

; Modyfikatory wspczynnikw Rosmar

3f5e dta $fd, $fe, $fc, $fc, $08, $04, $04, $03

; Procedura prbuje wykona losowy ruch wind, jeeli Magic Knight znajduje
; si w lokacji, z ktrej nie zauway tego ruchu

3f66 lda $090d          we numer lokacji MK
3f69 bne $3f6c          jeeli nie jest on w windzie -> $3f6c
3f6b rts                w przeciwnym wypadku powrt z procedury
3f6c sec                -1
3f6d sbc #$01
3f6f and #$07           uzyskaj nr lokacji na pitrze liczony o zera
3f71 beq $3f6b          jeli 0 (MK mgby zobaczy ruch windy) -> $3b6b (rts)
3f73 lda random         Wylosuj liczb od 0 do 6 (nowy nr pitra windy)
3f76 and #$07
3f78 cmp #$07           jeeli jest ona rwna 7 -> $3f73 (ponowne losowanie)
3f7a beq $3f73
3f7c tax                wylosowana liczba do X
3f7d lda $093a          sprawd, czy Thor naprawi wind
3f80 and #$01
3f82 bne $3f88          tak -> $3f88 (wylosowany numer jest prawidowy)
3f84 cpx #$05           czy winda ma zjecha na jeden z dwch najnisz. poz.?
3f86 bcs $3f6b          tak -> $3f6b (rts - brak ruchu windy)
3f88 txa                nowy nr pitra windy do A
3f89 pha                zachowaj go na stosie
3f8a jsr $2e70          zablokuj wyjcia "do" i "z" windy na wszystkich pitr.
3f8d pla                we ze stosu nowy nr pitra windy
3f8e sta $0927          zapisz go w komrce zawierajcej pooenie windy
3f91 asl @              *8
3f92 asl @
3f93 asl @
3f94 clc                +1 (bdzie to nr pierwszej lok. na pitrze z wind)
3f95 adc #$01
3f97 sta $4a38          wyjcie z windy w prawo bdzie prowadzio do tej lok.
3f9a asl @              *2 - powstanie indeks do tablicy pocze midzylokac.
3f9b tax                indeks ten przesyamy do X
3f9c lda #$00           wyjcie w lewo z pierwszej lokacji tym pitrze bdzie
3f9e sta $4a37,x        prowadzio do windy
3fa1 rts

3fa2 lda #$00           zablokuj upyw czasu i losowe ruchy postaci
3fa4 sta $0947
3fa7 inc $0943          zwiksz o 1 liczb uwolnionych postaci
3faa jsr $4199          szybkie miganie ramk obrazu (rzucanie czaru)
3fad jsr $0dd1          Wyczy ekran
3fb0 lda #$24           rysuj okienko nr $24
3fb2 jsr $1727
3fb5 ldx #$77           drukuj "WELL DONE MAGIC KNIGHT...KNIGHT-TYME..."
3fb7 ldy #$51
3fb9 jsr $148b
3fbc lda #$78           ustaw aktualn i now pozycj X Magic Knighta na
3fbe sta $0445          odpowiadajc rodkowi ekranu
3fc1 sta $0448
3fc4 lda #$4a           ustaw aktualn i now pozycj Y Magic Knighta
3fc6 sta $0446
3fc9 sta $0449
3fcc lda #$00           ustaw w $0447 numer poprzedniej bitmapy przypisanej MK
3fce sta $0447          (brak poprzedniej bitmapy - nie bdzie usuwania)
3fd1 lda #$01           niech Magic Knight bdzie wywietlany za pomoc
3fd3 sta $044a          bitmapy o numerze 1
3fd6 jsr $2641          Narysuj Magic Knighta
3fd9 ldx #$32           miganie ramk poniej ma si powtrzy 50 razy
3fdb txa                X na stos
3fdc pha
3fdd jsr $4161          wolne miganie ramk ekranu (jazda wind)
3fe0 pla                we X ze stosu
3fe1 tax
3fe2 dex                X -= 1
3fe3 bne $3fdb          jeeli nie jest to ostatni raz -> $3fdb
3fe5 jsr $211c          Wydrukuj "Press fire to continue" i poczekaj na fire
3fe8 ldx #$f5           drukuj "YOU HAVE SUCCEED IN YOUR TASK BUT A MUCH..."
3fea ldy #$51           i zakocz gr
3fec jmp $2c49

; Procedura wykonuje losowe przemieszenie postaci wystpujcych w grze

3fef lda $0947          czy ustawiony jest bit nr 1 w 0947?
3ff2 and #$02
3ff4 bne $3ff7          tak -> wykonuj losowe przemieszczanie postaci
3ff6 rts                powrt - brak przemieszczenia postaci
3ff7 inc $0929          zwiksz licznik uywany przy przemieszczaniu postaci
3ffa lda $0929          jeeli jest on rwny 32, to ustaw go na 0
3ffd and #$1f
3fff sta $0929
4002 and #$18           czy wysza warto >= 8
4004 bne $3ff6          tak -> $3ff6 (rts) - adna posta si nie przemieszcza
4006 lda $0929          we t warto, ktra jest teraz numerem post. przem.
4009 bne $4014          jeeli to nie GIMBALL -> $4014 (dalsze sprawdzanie)
400b lda $0916          sprawd, czy rzucono wszystkimi trzema krysztaami
400e and #$01           w GIMBALLA
4010 beq $3ff6          nie -> $3ff6 (rts)
4012 bne $401f          tak -> $401f
4014 cmp #$07           czy jest to BANSHEE?
4016 bne $401f          nie -> $401f (przemieszczamie waciwe)
4018 lda $0915          sprawd, czy Magic Knight upuci ju GLOWING BOTTLE
401b and #$01           (czy jest BANSHEE)
401d beq $3ff6          nie -> $3ff6 (rts)
401f lda $0929          we numer postaci, ktra ma si przemieci
4022 jsr $31b4          Oblicz adres pocztku atrybutw postaci o numerze w A
4025 ldy #$06           we SLEEP STATUS
4027 lda ($d9),y
4029 bmi $3ff6          jeeli posta pi -> $3ff6 (rts)
402b lda $0929          we numer postaci, ktra ma si przemieci
402e asl @              *2
402f clc
4030 adc $0929          dodaj jeszcze numer postaci (mnoenie przez 3)
4033 tax                uzyskany wynik bdzie indeksem w tablicy rozm. postaci
4034 lda $090d          we numer lokacji Magic Knighta
4037 cmp $047a,x        czy jest taki sam jak lokacja postaci przemieszczanej
403a bne $403d          nie -> $403d
403c rts                powrt (posta si nie przemieszcza)
403d lda $047a,x        we nr lokacji, w ktrej przebywa posta
4040 bmi $403c          gdy posta pojawia si w dymku -> $403c (rts)
4042 cmp #$64           czy posta odesano przez "BLOW ELF-HORN"?
4044 beq $403c          tak -> $403c (rts) - postaci ju nie ma
4046 cmp #$63           czy posta odesano poprzez "GO AWAY"?
4048 bne $4052          nie -> $4052 - oblicz nr lokacji do ktrej si przem.
404a lda $0929          we numer postaci, ktra ma si przemieci
404d asl @              *4
404e asl @
404f clc                + 5 - obliczamy w ten sposb numer lokacji, z ktrej
4050 adc #$05                 posta wykonuje ruch
4052 jsr $408a          Zwr w A nr lok. do ktrej posta si przem. lub $ff
4055 cmp #$ff           czy ustalono, e posta si przemieszcza?
4057 beq $403c          nie -> $403c (rts)
4059 cmp $090d          czy posta przemieszcza si do lokacji Magic Knighta?
405c beq $403c          tak -> $404c (rts)
405e sta $407b          zapisz nr lokacji jako argument lda (poniej)
4061 ldx $0929          wpisz do X numer postaci, ktra ma si przemieci
4064 jsr $1e3a          zwr w X, Y woln pozyc. dla postaci w X dla lok. w A
4067 cmp #$04           czy udao si znale woln pozycj?
4069 beq $403c          nie -> $403c (rts)
406b stx $4080          zapisz pozycj X jako argument lda (poniej)
406e sty $4085          zapisz pozycj Y jako argument lda (poniej)
4071 lda $0929          we numer postaci, ktra ma si przemieci
4074 asl @              *2
4075 clc                dodaj do wyniku numer postaci (mnoenie przez 3)
4076 adc $0929
4079 tax                bdzie to indeks do tablicy z rozmieszczeniem postaci
407a lda #$00           we nr lok. do ktrej posta si przemieszcza (ust.)
407c sta $047a,x        zapisz w odpowiednie miejsce w tablicy z rozmieszcz.
407f lda #$00           we pozycj X postaci (argument jest ustawiony)
4081 sta $047b,x        zapisz w odpowiednie miejsce w tablicy z rozmieszcz.
4084 lda #$00           we pozycj Y postaci (argument jest ustawiony)
4086 sta $047c,x        zapisz w odpowiednie miejsce w tablicy z rozmieszcz.
4089 rts                powrt - posta przemieszczono

408a asl @              pomn przez 2 nr lok. w ktrej posta si znajduje
408b pha                powstay indeks do tabl. pocze lok. zapisz na stos
408c lda $0929          we nr postaci, ktra ma si przemieci
408f and #$01           pobierz najmodszy bajt z tego numeru
4091 sta $40c4          zapisz go do komrki pomocniczej
4094 lda $0925          we liczb godzin czasu gry, ktra jeszcze pozostaa
4097 and #$01           pobierz najmodszy bajt z tej liczby
4099 eor $40c4          wykonaj eor na komrce pomocniczej
409c sta $40c4          zapisz wynik do komrki pomocniczej
409f pla                odczytaj ze stosu indeks to tablicy pocze lokacji
40a0 clc                dodajemy do tego warto z kom. pom. uzyskujc indeks
40a1 adc $40c4          do komrki opisujcej poczenie z lew lub praw lok.
40a4 tax                wpisujemy indeks do X
40a5 lda $4a37,x        pobieramy nr lokacji, do ktrej posta ma si przem.
40a8 cmp #$ff           czy w ogle taka lokacja istnieje?
40aa beq $40c1          nie -> 40c1 (zwracamy $ff - nie ma przemieszczamy si)
40ac cmp #$22           czy jest to lokacja "THE GAS ROOM"?
40ae beq $40c1          tak -> 40c1 (zwracamy $ff - nie ma przemieszczamy si)
40b0 cmp #$12           czy jest to lokacja "THE LITTLE BOTTLE"?
40b2 beq $40c1          tak -> 40c1 (zwracamy $ff - nie ma przemieszczamy si)
40b4 cmp #$2e           czy jest to lokacja "THE PIT"?
40b6 beq $40c1          tak -> 40c1 (zwracamy $ff - nie ma przemieszczamy si)
40b8 cmp #$09           czy jest to lokacja "THE TOWER"?
40ba beq $40c1          tak -> 40c1 (zwracamy $ff - nie ma przemieszczamy si)
40bc cmp #$1d           czy jest to lokacja "THE WALL"?
40be beq $40c1          tak -> 40c1 (zwracamy $ff - nie ma przemieszczamy si)
40c0 rts                w A zwracamy nr lokacji do ktrej posta si przem.
40c1 lda #$ff           zwracamy $ff co oznacza, e posta si nie przem.
40c3 rts
40c4 dta 0

; Procedura sprawdza, czy polecenie wykonywane na postaci wybieranej z listy
; nie dotyczy GIMBALLA w chwili, kiedy nie mona tego zrobi. Jeeli tak,
; drukowany jest odpowiedni komunikat i nastpuje powrt z caej procedury
; realizujcej polecenie.

40c5 lda $0913          pobierz identyfikator postaci wybranej z listy
40c8 beq $40cb          czy jest to GIMBALL (o identyfikatorze 0)?
40ca rts                nie -> ok (powrt)
40cb lda $0948          sprawd, czy wolno wykonywa polecenie na GIMBALLU
40ce and #$01           (wskazuje na to ustawiony najmodszy bit w kom. $0948)
40d0 bne $40ca          jeeli ustawiony -> $40ca (wolno wykona)
40d2 lda $0916          sprawd, czy rzucono ju wszystkimi trzema krysztaami
40d5 and #$01           w GIMBALLA
40d7 bne $40ca          tak -> $40ca (rts)
40d9 pla                zdejmij ze stosu adres powrotu do procedury woajcej
40da pla                (jedna z dwch procedur drukujca list postaci)
40db pla                oraz do procedury nadrzdnej - realizujcej polecenie
40dc pla
40dd lda #$20           drukuj tekst "GIMBALL IS NOT YET RELEASED ... "
40df ldx #$f4
40e1 ldy #$4f
40e3 jmp $2401          i wr tak, jakby obsug polecenia zakoczono

; Procedura (o kilku wejciach) generujca efekt dwikowy

40e6 ldx #$00
40e8 bit $03a2          lub ldx #$03, gdy skok do $40e9
40eb bit $06a2          lub ldx #$06, gdy skok do $40ec
40ee bit $09a2          lub ldx #$09, gdy skok do $40ef
40f1 bit $0ca2          lub ldx #$0c, gdy skok do $40f2
40f4 bit $0fa2          lub ldx #$0f, gdy skok do $40f5
40f7 bit $12a2          lub ldx #$12, gdy skok do $40f8
40fa bit $15a2          lub ldx #$15, gdy skok do $40fb
40fd bit $18a2          lub ldx #$15, gdy skok do $40fe
4100 lda $0947          przechowanie komrki zawierajcej wskaniki
4103 pha                upywu czasu i losowych ruchw postaci na stosie
4104 ora #$04           ustawienie w niej bitu nr 2, co nigdzie nie jest
4106 sta $0947          sprawdzane
4109 lda $4146,x        We trzy bajty sterujce z tablicy
410c sta $4129          i wstaw je jako operandy dla instrukcji
410f lda $4147,x        eor, ora i and znajdujcych si poniej
4112 sta $412b
4115 lda $4148,x
4118 sta $412d
411b lda #$00           wcz standardowe dwiki (bez filtrw, kanay osobno)
411d sta audctl
4120 lda #$af           maksymalna gono, czyste dwiki
4122 sta audc1
4125 lda #$00           zacznij od bajtu $00
4127 pha
4128 eor #$00           Wykonaj operacj na bajcie w zalenoci od
412a ora #$00           wybranego efektu
412c and #$ff
412e sta audf1          graj!
4131 ldy #$40           ptla opniajca
4133 dey
4134 bne $4133
4136 pla                zwiksz A o 1
4137 clc
4138 adc #$01
413a bne $4127          na pocztek zewntrznej ptli
413c lda #$a0           cicho!
413e sta audc1
4141 pla                odtworzenie komrki zawierajcej wskaniki upywu
4142 sta $0947          czasu i ruchw postaci
4145 rts

4146 dta $ff, $00, $ff         eor #$ff
4149 dta $00, $00, $ff         nop
414c dta $ff, $28, $ff         eor #$ff, ora #$28
414f dta $00, $1e, $ff         ora #$1e
4152 dta $00, $00, $1f         and #$1f
4155 dta $00, $00, $7f         and #$7f
4158 dta $00, $a0, $ff         ora #$a0
415b dta $ff, $40, $ff         eor #$ff, ora #$40
415e dta $ff, $1e, $ff         eor #$ff, ora #$1e

; Wolne miganie ramk obrazu (jazda wind)

4161 lda #$00           wcz standardowe dwiki (bez filtrw, kanay osobno)
4163 sta audctl
4166 lda #$af
4168 sta audc1          czysty dwik, maksymalna gono
416b lda #$00
416d sta $4197
4170 lda #$f8           $800 obrotw zewntrznej ptli (czas trwania efektu)
4172 sta $4198
4175 ldx #$00
4177 stx colbak         pocztek gwnej ptli
417a txa
417b eor #$ff
417d sta audf1
4180 ldy #$d2           $d2 obroty wewntrznej ptli opnienia
4182 dey
4183 bne $4182
4185 inx
4186 inx
4187 inc $4197          zwiksz dwubajtowy licznik
418a bne $4177
418c inc $4198
418f bne $4177
4191 lda #$a0
4193 sta audc1
4196 rts
4197 dta a(0)

; Szybkie miganie ramk obrazu (podczas rzucania czaru)

4199 lda #$00           wcz standardowe dwiki (bez filtrw, kanay osobno)
419b sta audctl
419e lda #$af           czysty dwik, maksymalna gono
41a0 sta audc1
41a3 lda #$00
41a5 sta $41cf
41a8 lda #$f8           $800 obrotw zewntrznej ptli (czas trwania efektu)
41aa sta $41d0
41ad ldx #$00
41af txa                pocztek gwnej ptli
41b0 eor #$ff
41b2 sta colbak
41b5 sta audf1
41b8 ldy #$84           $84 obroty wewntrznej ptli opnienia
41ba dey
41bb bne $41ba
41bd inx
41be inx
41bf inc $41cf          zwiksz dwubajtowy licznik
41c2 bne $41af
41c4 inc $41d0
41c7 bne $41af
41c9 lda #$a0
41cb sta audc1
41ce rts
41cf dta a(0)           rejestr tymczasowy

; Procedura rysuje na ekranie okienko, w ktrym umieszczone s wartoci z
; rejestrw kolorw. Podczas normalnej gry procedura ta nie jest wykorzystana.

41d1 lda #$09           ustaw pozycj dolnej krawdzi okienka nr $21 na 9
41d3 sta $4bb6
41d6 lda #$21           rysuj okienko nr $21
41d8 jsr $1727
41db ldx #$13           umie w X i Y adres miejsca w pamici, gdzie bdziemy
41dd ldy #$42           drukowa ($4213 - za napisem COL0:)
41df lda color4         bdziemy drukowa zawarto rejestru color4
41e2 jsr $3d42          Przekszta liczb w A do postaci zapisu dziesitnego
41e5 ldx #$32           umie w X i Y adres miejsca w pamici, gdzie bdziemy
41e7 ldy #$42           drukowa ($4232 - za napisem COL1:)
41e9 lda color0         bdziemy drukowa zawarto rejestru color4
41ec jsr $3d42          Przekszta liczb w A do postaci zapisu dziesitnego
41ef ldx #$51           umie w X i Y adres miejsca w pamici, gdzie bdziemy
41f1 ldy #$42           drukowa ($4251 - za napisem COL2:)
41f3 lda color1         bdziemy drukowa zawarto rejestru color1
41f6 jsr $3d42          Przekszta liczb w A do postaci zapisu dziesitnego
41f9 ldx #$70           umie w X i Y adres miejsca w pamici, gdzie bdziemy
41fb ldy #$42           drukowa ($4270 - za napisem COL3:)
41fd lda color2         bdziemy drukowa zawarto rejestru color1
4200 jsr $3d42          Przekszta liczb w A do postaci zapisu dziesitnego
4203 ldx #$0b           drukuj: "COL0: ... COL1: ... COL2: ... COL3: ..."
4205 ldy #$42
4207 jsr $148b
420a rts

; Zawarto okienka z wartociami rejestrw kolorw

;420b dta $10, $64, c' COL0:    ', $10, $24, c'A', $5c, c' '
;     dta $10, $25, c'A', $5c, c' ', $10, $26, c'A', $5c
;     dta c' c', $10, $27, c'A', $5b
;422a dta $10, $64, c' COL1:    c', $10, $64, c' A', $5c, c' '
;     dta $10, $65, c'A', $5c, c' ', $10, $66, c'A', $5c
;     dta c' c', $10, $67, c'A', $5b
;4249 dta $10, $a4, c' COL2:    c', $10, $a4, c' A', $5c, c' '
;     dta $10, $a5, c'A', $5c, c' ', $10, $a6, c'A', $5c
;     dta c' c', $10, $a7, c'A', $5b
;4268 dta $10, $e4, c' COL3:    c', $10, $e4, c' A', $5c, c' '
;     dta $10, $e5, c'A', $5c, c' ', $10, $e6, c'A', $5c
;     dta c' c', $10, $e7, c'A', $00

	org $4287

; Niewykorzystana procedura rysujca na ekranie okienko z aktualnymi
; wartociami rejestrw kolorw, pozwalajca na ich zmian za pomoc ruchw
; joysticka. Po wciniciu FIRE nastpuje wyjcie z procedury.

4287 jsr $41d1          narysuj okienko z aktualnym stanem rejestrw koloru
428a nop
428b nop
428c nop
428d jsr $1be5          Odczytaj stan joystickw. Wynik w $091c i w A.
4290 and #$10           sprawd, czy zosta wcinity fire
4292 bne $4295          nie -> przeskocz nastpn instrukcj
4294 rts                powrt
4295 lda $091c          We odczytany stan joysticka
4298 and #$01           sprawd, czy jest on wychylony w gr
429a bne $42a8          nie -> $42a8 (dalsze sprawdzanie stanu joysticka)
429c lda color4         zwiksz o 2 zawarto rejestru color4
429f clc
42a0 adc #$02
42a2 sta color4
42a5 jmp $4287          skok na pocztek procedury odczytujcej stan joysticka
42a8 lda $091c          We odczytany stan joysticka
42ab and #$02           sprawd, czy jest on wychylony w d
42ad bne $42bb          nie -> $42bb (dalsze sprawdzanie stanu joysticka)
42af lda color1         zwiksz o 2 zawarto komrki color1
42b2 clc
42b3 adc #$02
42b5 sta color1
42b8 jmp $4287          skok na pocztek procedury odczytujcej stan joysticka
42bb lda $091c          We odczytany stan joysticka
42be and #$04           sprawd, czy jest on wychylony w lewo
42c0 bne $42ce          nie -> $42ce (dalsze sprawdzania stanu joysticka)
42c2 lda color2         zwiksz o 2 zawarto komrki color2
42c5 clc
42c6 adc #$02
42c8 sta color2
42cb jmp $4287          skok na pocztek procedury odczytujcej stan joysticka
42ce lda $091c          We odczytany stan joysticka
42d1 and #$08           sprawd, czy jest on wychylony w prawo
42d3 bne $428d          nie -> $428d (sprawdzaj od nowa stan joysticka)
42d5 lda color0         zwiksz o 2 zawarto komrki color2
42d8 clc
42d9 adc #$02
42db sta color0
42de jmp $4287          skok na pocztek tej procedury

; Sprawd, czy nie nacinito BREAK

42e1 lda brkkey         Sprawd stan klawisza BREAK
42e3 beq $42e6          gdy BREAK nacinity -> przeskocz nastpn instrukcj
42e5 rts
42e6 lda #$01           Ustaw status klawisza BREAK jako nienacinitego
42e8 sta brkkey
42ea lda #$b0           Dopu przerwania: BREAK KEY, SERIAL IN, SERIAL OUT
42ec sta pokmsk
42ee sta irqen
42f1 ldx #$a2           drukuj "BREAK KEY PRESSED" i zakocz gr
42f3 ldy #$50
42f5 jmp $2c49

; -----------------------------------------------------------------------------

; Atrybuty postaci

; 00 - STRENGTH
; 01 - HAPPINESS
; 02 - STAMINA
; 03 - POWER
; 04 - FOOD LEVEL
; 05 - HELP STATUS (> 0 - warunek konieczny do udzielenia pomocy)
; 06 - SLEEP STATUS ($80 - ASLEEP, $00 - AWAKE)
; 07 - nr tekstu dodatkowego przypisanego postaci + $80

; Atrybuty przedmiotw

; 00 - WEIGHT
; 01 - DROP STATUS ($00 - mona upuci, > 0 - nie mona)
; 02 - READ STATUS (<$80, jeeli brak opisu lub $80 + <nr napisu>)
; 03 - MAGIC POWER (>0 - ma)
; 04 - THROW/BLOW STATUS (ustawiony bit 0 - w przedmiot mona dmucha;
;                         ustawiony bit 1 - przedmiotem mona rzuca;
;                         ustawiony bit 4 - rzucenie przedmiot. powoduje mier;
;                         ustawiony bit 5 - dany przedmiot jest krysztaem)
; 05 -
; 06 - paleta uywana przy wywietlaniu przedmiotu
; 07 - numer bitmapy

; Mapa pamici

; 4dab - 4e64 - tablica czterobajtowych elementw opisujca bitmapy przypisane
;               przedmiotom;
; 5f68 - ???? - tablica napisw bdcych opisami przedmiotw;
; 714d - ???? - tablica adresw danych lokacji
; 7fc0 - 8200 - bitmapy (kada 2x32 bajty) odpowiadajce poszczeglnym fazom
;               animacji Magic Knighta;